home *** CD-ROM | disk | FTP | other *** search
/ Skunkware 5 / Skunkware 5.iso / src / X11 / Fresco / build / Unix / config / cf / Imake.rules < prev    next >
Text File  |  1995-07-12  |  66KB  |  2,149 lines

  1. XCOMM -----------------------------------------------------------------------
  2. XCOMM Imake rules for building libraries, programs, scripts, and data files
  3. XCOMM rules:  $XConsortium: Imake.rules,v 1.197 94/12/05 19:30:41 gildea Exp $
  4.  
  5. /*
  6.  *           MACHINE-INDEPENDENT RULES; DO NOT MODIFY
  7.  *
  8.  * Warning, when defining rules: make sure you do not include both a trailing
  9.  * backslash and double ampersand backslash or else you will get an extra
  10.  * backslash in the Makefile.
  11.  * 
  12.  * The following macros are defined for the various templates and Imakefiles
  13.  * (for a list of the applicable make variables, see the template files):
  14.  * 
  15.  * Concat            (a,b)
  16.  * Concat3            (a,b,c)
  17.  * Concat4            (a,b,c,d)
  18.  * _Use                (a,b)
  19.  * _UseCat            (a,b,c)
  20.  * ProgramTargetName        (target)
  21.  * RunProgram            (progvar,options)
  22.  * RemoveFile            (file)
  23.  * RemoveFiles            (files)
  24.  * CenterLoadTarget        (target,srclist,libs,defines)
  25.  * CenterProgramTarget        (program,srclist,objlist,locallibs,syslibs)
  26.  * SentinelLinkTarget        (step,program,linklist)
  27.  * SentinelProgramTarget    (program,deplist,linklist)
  28.  * SentinelCplusplusProgramTarget    (program,deplist,linklist)
  29.  * PurifyLinkTarget        (step,program,linklist)
  30.  * PurifyProgramTarget        (program,deplist,linklist)
  31.  * PurifyCplusplusProgramTarget    (program,deplist,linklist)
  32.  * ProofLinkTarget        (step,program,linklist)
  33.  * ProofProgramTarget        (program,deplist,linklist)
  34.  * ProofCplusplusProgramTarget    (program,deplist,linklist)
  35.  * ProofCleanTarget        ()
  36.  * RemoveTargetProgram        (program)
  37.  * MakeDir            (dir)
  38.  * BuildIncludesTop        (srclist)
  39.  * BuildIncludes        (srclist,dstsubdir,dstupdir)
  40.  * LinkRule            (program,options,objects,libraries)
  41.  * HostLinkRule            (program,options,objects,libraries)
  42.  * NormalProgramTarget        (program,objects,deplibs,locallibs,syslibs)
  43.  * SetUIDProgramTarget        (program,objects,deplibs,locallibs,syslibs)
  44.  * SingleProgramTarget        (program,objects,locallibs,syslibs)
  45.  * SimpleProgramTarget        (program)
  46.  * ComplexProgramTarget        (program)
  47.  * ComplexProgramTarget_1    (program,locallib,syslib)
  48.  * ComplexProgramTarget_2    (program,locallib,syslib)
  49.  * ComplexProgramTarget_3    (program,locallib,syslib)
  50.  * ServerTargetWithFlags    (server,subdirs,objects,libs,syslibs,flags)
  51.  * ServerTarget            (server,subdirs,objects,libs,syslibs)
  52.  * MoveToBakFile        (file)
  53.  * RMoveToBakFile        (file)
  54.  * RanLibrary            (args)
  55.  * LibraryTargetName        (libname)
  56.  * LibraryTargetNameSuffix    (libname,suffix)
  57.  * InstallNamedTarget        (step,srcname,flags,dest,dstname)
  58.  * InstallTarget        (step,file,flags,dest)
  59.  * InstallLibrary        (libname,dest)
  60.  * MergeIntoInstalledLibrary    (tolib,fromlib)
  61.  * InstallLibraryAlias        (libname,alias,dest)
  62.  * InstallLintLibrary        (libname,dest)
  63.  * InstallManPageLong        (file,destdir,dest)
  64.  * InstallManPage        (file,destdir)
  65.  * InstallManPageAliases    (file,destdir,aliases)
  66.  * InstallNamedNonExec        (srcname,dstname,dest)
  67.  * InstallNonExecFile        (file,dest)
  68.  * InstallNonExec        (file,dest)
  69.  * InstallProgramWithFlags    (program,dest,flags)
  70.  * InstallProgram        (program,dest)
  71.  * InstallScript        (program,dest)
  72.  * InstallNamedProg        (srcname,dstname,dest)
  73.  * LinkFileList            (step,list,dir,sub)
  74.  * InstallMultipleDestFlags    (step,list,dest,flags)
  75.  * InstallMultipleDest        (step,list,dest)
  76.  * InstallMultiple        (list,dest)
  77.  * InstallMultipleFlags        (list,dest,flags)
  78.  * InstallMultipleMan        (list,dest)
  79.  * DependDependency        ()
  80.  * DependTarget            ()
  81.  * DependTarget3        (srcs1,srcs2,srcs3)
  82.  * CleanTarget            ()
  83.  * TagsTarget            ()
  84.  * ImakeDependency        (target)
  85.  * BuildMakefileTarget        (notused,imakeflags)
  86.  * MakefileTarget        ()
  87.  * LibMkdir            (dir)
  88.  * LibCleanDir            (dir)
  89.  * LintLibReferences        (varname,libname,libsource)
  90.  * UnsharedLibReferences    (varname,libname,libsource)
  91.  * SharedLibDependencies    (libname,libsource,revname)
  92.  * SharedDSLibDependencies    (libname,libsource,revname)
  93.  * SharedLibReferences        (varname,libname,libsource,revname,rev)
  94.  * SharedDSLibReferences    (varname,libname,libsource,revname,rev)
  95.  * ObjectCompile        (options)
  96.  * NormalLibObjCompile        (options)
  97.  * NormalSharedLibObjCompile    (options)
  98.  * LibObjCompile        (dir,options)
  99.  * DebuggedLibObjCompile    (options)
  100.  * ProfiledLibObjCompile    (options)
  101.  * SharedLibObjCompile        (options)
  102.  * NormalLibraryObjectRule    ()
  103.  * NormalFortranObjectRule    ()
  104.  * ObjectFromSpecialSource    (dst,src,flags)
  105.  * SpecialObjectRule        (objs,depends,options)
  106.  * NormalCplusplusObject    (baseobj,basedep)
  107.  * SpecialCplusplusObject    (baseobj,basedep,options)
  108.  * NormalSharedCplusplusObject    (baseobj,basedep)
  109.  * SpecialSharedCplusplusObject    (baseobj,basedep,options)
  110.  * SpecialCObjectRule        (basename,depends,options)
  111.  * LexFile            (file)
  112.  * YaccFile            (file,flags)
  113.  * MakeLibrary            (libname,objlist)
  114.  * NormalLibraryTarget        (libname,objlist)
  115.  * NormalLibraryTarget2        (libname,objlist1,objlist2)
  116.  * NormalLibraryTarget3        (libname,objlist1,objlist2,objlist3)
  117.  * NormalDepLibraryTarget    (libname,deplist,objlist)
  118.  * UnsharedLibraryTarget    (libname,objlist,down,up)
  119.  * UnsharedLibraryTarget3    (libname,objlist1,objlist2,objlist3,down,up)
  120.  * SubdirLibraryRule        (objlist)
  121.  * ProfiledLibraryTarget    (libname,objlist)
  122.  * DebuggedLibraryTarget    (libname,objlist)
  123.  * AliasedLibraryTarget        (libname,alias)
  124.  * NormalRelocatableTarget    (objname,objlist)
  125.  * ProfiledRelocatableTarget    (objname,objlist)
  126.  * DebuggedRelocatableTarget    (objname,objlist)
  127.  * LintLibraryTarget        (libname,srclist)
  128.  * NormalLintTarget        (srclist)
  129.  * LintTarget            ()
  130.  * LinkSourceFile        (src,dir)
  131.  * LinkFile            (tofile,fromfile)
  132.  * MakeSubincludesForBuild    (step,dir,srclist)
  133.  * NamedTargetSubdirs        (name,dirs,verb,flags,subname)
  134.  * NamedMakeSubdirs        (name,dirs)
  135.  * MakeSubdirs            (dirs)
  136.  * DependSubdirs        (dirs)
  137.  * ForceSubdirs            (dirs)
  138.  * InstallSubdirs        (dirs)
  139.  * InstallManSubdirs        (dirs)
  140.  * IncludesSubdirs        (dirs)
  141.  * FilterSubdirs        (dirs)
  142.  * HeadersSubdirs        (dirs)
  143.  * CleanHeadersSubdirs        (dirs)
  144.  * NamedCleanSubdirs        (name,dirs)
  145.  * CleanSubdirs            (dirs)
  146.  * NamedTagSubdirs        (name,dirs)
  147.  * TagSubdirs            (dirs)
  148.  * MakeLintSubdirs        (dirs,target,subtarget)
  149.  * LintSubdirs            (dirs)
  150.  * MakeLintLibSubdirs        (dirs)
  151.  * MakeMakeSubdirs        (dirs,target)
  152.  * MakefileSubdirs        (dirs)
  153.  * CppScriptTarget        (dst,src,defs,deplist)
  154.  * MakeScriptFromCpp        (name,defs)
  155.  * CppFileTarget        (dst,src,defs,deplist)
  156.  * MakeDirectories        (step,dirs)
  157.  * AllTarget            (depends)
  158.  *
  159.  *
  160.  * The following are in specific <os>Lib.rules:
  161.  *
  162.  * SharedCplusplusLibraryTarget    (libname,rev,solist,down,up,need_libs)
  163.  * SharedLibraryTarget        (libname,rev,solist,down,up)
  164.  * SharedLibraryDataTarget    (libname,rev,salist)
  165.  * InstallSharedLibrary        (libname,rev,dest)
  166.  * InstallSharedLibraryData    (libname,rev,dest)
  167.  * 
  168.  */
  169.  
  170. #define NullParameter
  171.  
  172. /* if [ -d ] or [ ! -d ] causes make to fail, define this as - */
  173. #ifndef DirFailPrefix
  174. #define DirFailPrefix
  175. #endif
  176.  
  177. /*
  178.  * Concat - concatenates two strings.
  179.  */
  180. #ifndef Concat
  181. #if (__STDC__ && !defined(UnixCpp)) || defined(AnsiCpp)
  182. #define Concat(a,b)a##b
  183. #else
  184. #define Concat(a,b)a/**/b
  185. #endif
  186. #endif
  187.  
  188. /*
  189.  * Concat3 - concatenates three strings.
  190.  */
  191. #ifndef Concat3
  192. #if (__STDC__ && !defined(UnixCpp)) || defined(AnsiCpp)
  193. #define Concat3(a,b,c)a##b##c
  194. #else
  195. #define Concat3(a,b,c)a/**/b/**/c
  196. #endif
  197. #endif
  198.  
  199. /*
  200.  * Concat4 - concatenates four strings.
  201.  */
  202. #ifndef Concat4
  203. #if (__STDC__ && !defined(UnixCpp)) || defined(AnsiCpp)
  204. #define Concat4(a,b,c,d)a##b##c##d
  205. #else
  206. #define Concat4(a,b,c,d)a/**/b/**/c/**/d
  207. #endif
  208. #endif
  209.  
  210. /*
  211.  * _Use - makes a choice based on UseInstalled.
  212.  */
  213. #ifndef _Use
  214. #ifdef UseInstalled
  215. #define _Use(a,b) a
  216. #else
  217. #define _Use(a,b) b
  218. #endif
  219. #endif /* _Use */
  220.  
  221. /*
  222.  * _UseCat - combination of _Use and Concat.
  223.  *           exists to avoid problems with some preprocessors
  224.  */
  225. #ifndef _UseCat
  226. #if (__STDC__ && !defined(UnixCpp)) || defined(AnsiCpp)
  227. #ifdef UseInstalled
  228. #define _UseCat(a,b,c) a##c
  229. #else
  230. #define _UseCat(a,b,c) b##c
  231. #endif
  232. #else
  233. #ifdef UseInstalled
  234. #define _UseCat(a,b,c) a/**/c
  235. #else
  236. #define _UseCat(a,b,c) b/**/c
  237. #endif
  238. #endif
  239. #endif /* _UseCat */
  240.  
  241. #ifndef ProgramTargetName
  242. #define ProgramTargetName(target)target
  243. #endif
  244.  
  245. #ifndef RunProgram
  246. #define RunProgram(progvar,options) $(progvar) options
  247. #endif
  248.  
  249. #ifndef RemoveFile
  250. #define RemoveFile(file) $(RM) file
  251. #endif /* RemoveFile */
  252.  
  253. #ifndef RemoveFiles
  254. #define RemoveFiles(files) $(RM) files
  255. #endif /* RemoveFiles */
  256.  
  257. /*
  258.  * CenterLoadTarget - generate rules to load files into CodeCenter
  259.  */
  260. #ifndef CenterLoadTarget
  261. #if HasCodeCenter
  262. #define CenterLoadTarget(target,srclist,libs,defines)            @@\
  263. ProgramTargetName(target):: srclist                    @@\
  264.     XCOMM load defines srclist libs
  265. #else
  266. #define CenterLoadTarget(target,srclist,libs,defines) /**/
  267. #endif
  268. #endif /* CenterLoadTarget */
  269.  
  270. /*
  271.  * CenterProgramTarget - generate rules to make CodeCenter read in sources
  272.  * and objects.
  273.  */
  274. #ifndef CenterProgramTarget
  275. #define CenterProgramTarget(program,srclist,objlist,locallibs,syslibs)    @@\
  276. CenterLoadTarget(Concat(debug_,program),srclist,$(EXTRA_LDOPTIONS) $(LOCAL_LDFLAGS) $(LDPRELIB) locallibs $(LDLIBS) syslibs,$(ALLDEFINES)) @@\
  277.                                     @@\
  278. CenterLoadTarget(Concat(odebug_,program),objlist,$(EXTRA_LDOPTIONS) $(LOCAL_LDFLAGS) $(LDPRELIB) locallibs $(LDLIBS) syslibs,$(ALLDEFINES))
  279. #endif /* CenterProgramTarget */
  280.  
  281. #ifndef SentinelLinkTarget
  282. #if HasSentinel
  283. #define SentinelLinkTarget(step,program,linklist)            @@\
  284. ProgramTargetName(step.sentinel):                    @@\
  285.     RemoveTargetProgram($@)                        @@\
  286.     $(CCENVSETUP) $(SENTINEL) $(SENTINELOPTIONS) $(CC) -o program.sentinel $(LDOPTIONS) linklist $(EXTRA_LOAD_FLAGS)
  287. #else
  288. #define SentinelLinkTarget(step,program,linklist) /**/
  289. #endif
  290. #endif /* SentinelLinkTarget */
  291.  
  292. /*
  293.  * SentinelProgramTarget - generate rules to make Sentinel image
  294.  */
  295. #ifndef SentinelProgramTarget
  296. #if HasSentinel
  297. #define    SentinelProgramTarget(program,deplist,linklist)            @@\
  298. ProgramTargetName(program.sentinel): deplist                @@\
  299.     RemoveTargetProgram($@)                        @@\
  300.     $(CCENVSETUP) $(SENTINEL) $(SENTINELOPTIONS) $(CC) -o $@ $(LDOPTIONS) linklist $(EXTRA_LOAD_FLAGS) @@\
  301.  
  302. clean clean.sentinel::                            @@\
  303.     RemoveFile(program.sentinel)
  304. #else
  305. #define    SentinelProgramTarget(program,deplist,linklist) /**/
  306. #endif
  307. #endif /* SentinelProgramTarget */
  308.  
  309. /*
  310.  * SentinelCplusplusProgramTarget - generate rules to make Sentinel image 
  311.  */
  312. #ifndef SentinelCplusplusProgramTarget
  313. #if HasSentinel
  314. #define    SentinelCplusplusProgramTarget(program,deplist,linklist)    @@\
  315. ProgramTargetName(program.sentinel): deplist                @@\
  316.     RemoveTargetProgram($@)                        @@\
  317.     $(CXXENVSETUP) $(SENTINEL) $(SENTINELOPTIONS) $(CXX) -o $@ $(CXXLDOPTIONS) linklist $(EXTRA_LOAD_FLAGS) @@\
  318.                                     @@\
  319. clean clean.sentinel::                            @@\
  320.     RemoveFile(program.sentinel)
  321. #else
  322. #define    SentinelCplusplusProgramTarget(program,deplist,linklist) /**/
  323. #endif
  324. #endif /* SentinelCplusplusProgramTarget */
  325.  
  326. #ifndef PurifyLinkTarget
  327. #if HasPurify
  328. #define PurifyLinkTarget(step,program,linklist)                @@\
  329. ProgramTargetName(step.pure):                        @@\
  330.     RemoveTargetProgram($@)                        @@\
  331.     $(CCENVSETUP) $(PURIFY) $(PURIFYOPTIONS) $(CC) -o program.pure $(LDOPTIONS) linklist $(EXTRA_LOAD_FLAGS)
  332. #else
  333. #define PurifyLinkTarget(step,program,linklist) /**/
  334. #endif
  335. #endif /* PurifyLinkTarget */
  336.  
  337. /*
  338.  * PurifyProgramTarget - generate rules to make Purify'ed image
  339.  */
  340. #ifndef PurifyProgramTarget
  341. #if HasPurify
  342. #define    PurifyProgramTarget(program,deplist,linklist)            @@\
  343. ProgramTargetName(program.pure): deplist                @@\
  344.     RemoveTargetProgram($@)                        @@\
  345.     $(CCENVSETUP) $(PURIFY) $(PURIFYOPTIONS) $(CC) -o $@ $(LDOPTIONS) linklist $(EXTRA_LOAD_FLAGS) @@\
  346.                                     @@\
  347. clean clean.pure::                            @@\
  348.     RemoveFile(program.pure)
  349. #else
  350. #define    PurifyProgramTarget(program,deplist,linklist) /**/
  351. #endif
  352. #endif /* PurifyProgramTarget */
  353.  
  354. /*
  355.  * PurifyCplusplusProgramTarget - generate rules to make Purify'ed image
  356.  */
  357. #ifndef PurifyCplusplusProgramTarget
  358. #if HasPurify
  359. #define    PurifyCplusplusProgramTarget(program,deplist,linklist)        @@\
  360. ProgramTargetName(program.pure): deplist                @@\
  361.     RemoveTargetProgram($@)                        @@\
  362.     $(CXXENVSETUP) $(PURIFY) $(PURIFYOPTIONS) $(CXX) -o $@ $(CXXLDOPTIONS) linklist $(EXTRA_LOAD_FLAGS) @@\
  363.                                     @@\
  364. clean clean.pure::                            @@\
  365.     RemoveFile(program.pure)
  366. #else
  367. #define    PurifyCplusplusProgramTarget(program,deplist,linklist) /**/
  368. #endif
  369. #endif /* PurifyCplusplusProgramTarget */
  370.  
  371. #ifndef ProofLinkTarget
  372. #if HasTestCenter
  373. #define ProofLinkTarget(step,program,linklist)                @@\
  374. ProgramTargetName(step.tc):                        @@\
  375.     RemoveTargetProgram($@)                        @@\
  376.     $(CCENVSETUP) $(PROOF) $(PROOFOPTIONS) $(CC) -o program.tc $(LDOPTIONS) linklist $(EXTRA_LOAD_FLAGS)
  377. #else
  378. #define ProofLinkTarget(step,program,linklist) /**/
  379. #endif
  380. #endif /* ProofLinkTarget */
  381.  
  382. /*
  383.  * ProofProgramTarget - generate rules to make Proof'ed image
  384.  */
  385. #ifndef ProofProgramTarget
  386. #if HasTestCenter
  387. #define    ProofProgramTarget(program,deplist,linklist)            @@\
  388. ProgramTargetName(program.tc): deplist                    @@\
  389.     RemoveTargetProgram($@)                        @@\
  390.     $(CCENVSETUP) $(PROOF) $(PROOFOPTIONS) $(CC) -o $@ $(LDOPTIONS) linklist $(EXTRA_LOAD_FLAGS) @@\
  391.                                     @@\
  392. clean clean.tc::                            @@\
  393.     RemoveFiles(program.tc program.tc.*.*)
  394. #else
  395. #define    ProofProgramTarget(program,deplist,linklist) /**/
  396. #endif
  397. #endif /* ProofProgramTarget */
  398.  
  399. /*
  400.  * ProofCplusplusProgramTarget - generate rules to make Proof'ed image
  401.  */
  402. #ifndef ProofCplusplusProgramTarget
  403. #if HasTestCenter
  404. #define    ProofCplusplusProgramTarget(program,deplist,linklist)        @@\
  405. ProgramTargetName(program.tc): deplist                    @@\
  406.     RemoveTargetProgram($@)                        @@\
  407.     $(CXXENVSETUP) $(PROOF) $(PROOFOPTIONS) $(CXX) -o $@ $(CXXLDOPTIONS) linklist $(EXTRA_LOAD_FLAGS) @@\
  408.                                     @@\
  409. clean clean.tc::                            @@\
  410.     RemoveFiles(program.tc program.tc.*.*)
  411. #else
  412. #define    ProofCplusplusProgramTarget(program,deplist,linklist) /**/
  413. #endif
  414. #endif /* ProofCplusplusProgramTarget */
  415.  
  416. #ifndef ProofCleanTarget
  417. #if HasTestCenter
  418. #define ProofCleanTarget()                        @@\
  419. clean clean.tc::                            @@\
  420.     $(RM) -r TC.Cache
  421. #else
  422. #define ProofCleanTarget() /**/
  423. #endif
  424. #endif /* ProofCleanTarget */
  425.  
  426. #ifndef RemoveTargetProgram
  427. #if RemoveTargetProgramByMoving
  428. #define RemoveTargetProgram(program) \
  429. -if [ -f program ]; then RemoveFile(Concat(program,~)); $(MV) program Concat(program,~); fi
  430. #else
  431. #define RemoveTargetProgram(program) RemoveFile(program)
  432. #endif
  433. #endif /* RemoveTargetProgram */
  434.  
  435. #ifndef MakeDir
  436. #define MakeDir(dir) DirFailPrefix@if [ -d dir ]; then set +x; \    @@\
  437.         else (set -x; $(MKDIRHIER) dir); fi
  438. #endif /* MakeDir */
  439.  
  440. #ifndef BuildIncludesTop
  441. #define BuildIncludesTop(srclist)                    @@\
  442. includes::                                @@\
  443.     MakeDir($(BUILDINCDIR))                        @@\
  444.     @(set -x; cd $(BUILDINCDIR); for i in srclist; do \        @@\
  445.         RemoveFile($$i); \                    @@\
  446.         $(LN) $(BUILDINCTOP)/$(CURRENT_DIR)/$$i .; \        @@\
  447.     done)
  448. #endif /* BuildIncludesTop */
  449.  
  450. #ifndef BuildIncludes
  451. #define BuildIncludes(srclist,dstsubdir,dstupdir)            @@\
  452. includes::                                @@\
  453.     MakeDir($(BUILDINCDIR)/dstsubdir)                @@\
  454.     @(set -x; cd $(BUILDINCDIR)/dstsubdir; for i in srclist; do \    @@\
  455.         RemoveFile($$i); \                    @@\
  456.         $(LN) $(BUILDINCTOP)/dstupdir/$(CURRENT_DIR)/$$i .; \    @@\
  457.     done)
  458. #endif /* BuildIncludes */
  459.  
  460. #ifndef BuildInterfaces
  461. #define BuildInterfaces(srclist,dstsubdir,dstupdir)            @@\
  462. interfaces::                                @@\
  463.     MakeDir($(BUILDINCDIR)/dstsubdir)                @@\
  464.     @(set -x; cd $(BUILDINCDIR)/dstsubdir; for i in srclist; do \    @@\
  465.         RemoveFile($$i); \                    @@\
  466.         $(LN) $(BUILDINCTOP)/dstupdir/$(CURRENT_DIR)/$$i .; \    @@\
  467.     done)
  468. #endif /* BuildInterfaces */
  469.  
  470. /*
  471.  * LinkRule - link a program
  472.  */
  473. #ifndef LinkRule
  474. #define LinkRule(program,options,objects,libraries) \
  475. $(CCLINK) -o program options objects libraries $(EXTRA_LOAD_FLAGS)
  476. #endif /* LinkRule */
  477.  
  478. /*
  479.  * HostLinkRule - link a utility to be used on the build host
  480.  * (differs from LinkRule if cross compiling)
  481.  */
  482. #ifndef HostLinkRule
  483. #define HostLinkRule LinkRule
  484. #endif
  485.  
  486. #ifndef CplusplusLinkRule
  487. #define CplusplusLinkRule(program,options,objects,libraries) \
  488. $(CXXLINK) -o program options objects libraries $(EXTRA_LOAD_FLAGS)
  489. #endif /* CplusplusLinkRule */
  490.  
  491. /*
  492.  * NormalProgramTarget - generate rules to compile and link the indicated 
  493.  * program; since it does not use any default object files, it may be used for
  494.  * multiple programs in the same Imakefile.
  495.  */
  496. #ifndef NormalProgramTarget
  497. #define    NormalProgramTarget(program,objects,deplibs,locallibs,syslibs)    @@\
  498. ProgramTargetName(program): objects deplibs                @@\
  499.     RemoveTargetProgram($@)                        @@\
  500.     LinkRule($@,$(LDOPTIONS),objects,locallibs $(LDLIBS) syslibs)    @@\
  501.                                     @@\
  502. SentinelProgramTarget(program,objects deplibs,objects locallibs $(LDLIBS) syslibs) @@\
  503. PurifyProgramTarget(program,objects deplibs,objects locallibs $(LDLIBS) syslibs) @@\
  504. ProofProgramTarget(program,objects deplibs,objects locallibs $(LDLIBS) syslibs) @@\
  505.                                     @@\
  506. clean::                                    @@\
  507.     RemoveFile(ProgramTargetName(program))
  508. #endif /* NormalProgramTarget */
  509.  
  510.  
  511. /*
  512.  * NormalCplusplusProgramTarget - Like NormalTargetProgram, but uses
  513.  * C++ linking rules.
  514.  */
  515. #ifndef NormalCplusplusProgramTarget
  516. #define    NormalCplusplusProgramTarget(program,objects,deplibs,locallibs,syslibs)    @@\
  517. ProgramTargetName(program): objects deplibs                @@\
  518.     RemoveTargetProgram($@)                        @@\
  519.     CplusplusLinkRule($@,$(CXXLDOPTIONS),objects,locallibs $(LDLIBS) syslibs) @@\
  520.                                     @@\
  521. SentinelCplusplusProgramTarget(program,objects deplibs,objects locallibs $(LDLIBS) syslibs) @@\
  522. PurifyCplusplusProgramTarget(program,objects deplibs,objects locallibs $(LDLIBS) syslibs) @@\
  523. ProofCplusplusProgramTarget(program,objects deplibs,objects locallibs $(LDLIBS) syslibs) @@\
  524.                                     @@\
  525. clean::                                    @@\
  526.     RemoveFile(ProgramTargetName(program))
  527. #endif /* NormalCplusplusProgramTarget */
  528.  
  529.  
  530. #ifndef SetUIDProgramTarget
  531. #define SetUIDProgramTarget NormalProgramTarget
  532. #endif
  533.  
  534.  
  535. /*
  536.  * SingleProgramTarget - obsolete version of NormalProgramTarget that does
  537.  * not have deplibs.
  538.  */
  539. #ifndef SingleProgramTarget
  540. #define    SingleProgramTarget(program,objects,locallibs,syslibs)        @@\
  541. NormalProgramTarget(program,objects,NullParameter,locallibs,syslibs)
  542. #endif /* SingleProgramTarget */
  543.  
  544. /*
  545.  * SimpleProgramTarget - generate rules for compiling and linking programs
  546.  * that only have one C source file.  It should only be used in Imakefiles 
  547.  * that describe a single program.
  548.  */
  549. #ifndef SimpleProgramTarget
  550. #define    SimpleProgramTarget(program)                    @@\
  551.            OBJS = program.o                        @@\
  552.            SRCS = program.c                        @@\
  553.                                     @@\
  554. ComplexProgramTarget(program)
  555. #endif /* SimpleProgramTarget */
  556.  
  557. #ifndef SimpleCplusplusProgramTarget
  558. #define SimpleCplusplusProgramTarget(program)                @@\
  559.            OBJS = program.o                        @@\
  560.            SRCS = program.CCsuf                        @@\
  561.                                     @@\
  562. ComplexCplusplusProgramTarget(program)
  563. #endif /* SimpleCplusplusProgramTarget */
  564.  
  565. #ifndef ProgramTargetHelper
  566. #define    ProgramTargetHelper(program,srcs,objs,deplib,locallib,syslib)    @@\
  567. ProgramTargetName(program): $(objs) $(deplib)                @@\
  568.     RemoveTargetProgram($@)                        @@\
  569.     LinkRule($@,$(LDOPTIONS),$(objs),locallib $(LDLIBS) syslib)    @@\
  570.                                     @@\
  571. CenterProgramTarget(program,$(srcs),$(objs),locallib,syslib)        @@\
  572. SentinelProgramTarget(program,$(objs) $(deplib),$(objs) locallib $(LDLIBS) syslib) @@\
  573. PurifyProgramTarget(program,$(objs) $(deplib),$(objs) locallib $(LDLIBS) syslib) @@\
  574. ProofProgramTarget(program,$(objs) $(deplib),$(objs) locallib $(LDLIBS) syslib) @@\
  575.                                     @@\
  576. InstallProgram(program,$(BINDIR))                    @@\
  577. InstallManPage(program,$(MANDIR))
  578. #endif /* ProgramTargetHelper */
  579.  
  580. #ifndef CplusplusProgramTargetHelper
  581. #define    CplusplusProgramTargetHelper(program,srcs,objs,deplib,locallib,syslib) @@\
  582. ProgramTargetName(program): $(objs) $(deplib)                @@\
  583.     RemoveTargetProgram($@)                        @@\
  584.     CplusplusLinkRule($@,$(CXXLDOPTIONS),$(objs),locallib $(LDLIBS) syslib) @@\
  585.                                     @@\
  586. CenterProgramTarget(program,$(srcs),$(objs),locallib,syslib)        @@\
  587. SentinelCplusplusProgramTarget(program,$(objs) $(deplib),$(objs) locallib $(LDLIBS) syslib) @@\
  588. PurifyCplusplusProgramTarget(program,$(objs) $(deplib),$(objs) locallib $(LDLIBS) syslib) @@\
  589. ProofCplusplusProgramTarget(program,$(objs) $(deplib),$(objs) locallib $(LDLIBS) syslib) @@\
  590.                                     @@\
  591. InstallProgram(program,$(BINDIR))                    @@\
  592. InstallManPage(program,$(MANDIR))
  593. #endif /* CplusplusProgramTargetHelper */
  594.  
  595. /*
  596.  * ComplexProgramTarget - generate rules for compiling and linking the 
  597.  * program specified by $(OBJS) and $(SRCS), installing the program and its
  598.  * man page, and generating dependencies.  It should only be used in 
  599.  * Imakefiles that describe a single program.
  600.  */
  601. #ifndef ComplexProgramTarget
  602. #define    ComplexProgramTarget(program)                    @@\
  603.         PROGRAM = program                        @@\
  604.                                     @@\
  605. AllTarget(program)                            @@\
  606.                                     @@\
  607. ProgramTargetHelper(program,SRCS,OBJS,DEPLIBS,$(LOCAL_LIBRARIES),NullParameter) @@\
  608.                                     @@\
  609. DependTarget()                                @@\
  610. LintTarget()                                @@\
  611.                                     @@\
  612. clean::                                    @@\
  613.     RemoveFile(ProgramTargetName(program))
  614. #endif /* ComplexProgramTarget */
  615.  
  616. #ifndef ComplexCplusplusProgramTarget
  617. #define    ComplexCplusplusProgramTarget(program)                @@\
  618.         PROGRAM = program                        @@\
  619.                                     @@\
  620. AllTarget(program)                            @@\
  621.                                     @@\
  622. CplusplusProgramTargetHelper(program,SRCS,OBJS,DEPLIBS,$(LOCAL_LIBRARIES),NullParameter) @@\
  623.                                     @@\
  624. DependTarget()                                @@\
  625. LintTarget()                                @@\
  626.                                     @@\
  627. clean::                                    @@\
  628.     RemoveFile(ProgramTargetName(program))
  629. #endif /* ComplexCplusplusProgramTarget */
  630.  
  631. /*
  632.  * ComplexProgramTarget_1 - generate rules for compiling and linking the
  633.  * program specified by $(OBJS1) and $(SRCS1), installing the program and its
  634.  * man page, and generating dependencies for it and any programs described
  635.  * by $(SRCS2) and $(SRCS3).  It should be used to build the primary 
  636.  * program in Imakefiles that describe multiple programs.
  637.  */
  638. #ifndef ComplexProgramTarget_1
  639. #define    ComplexProgramTarget_1(program,locallib,syslib)            @@\
  640.             OBJS = $(OBJS1) $(OBJS2) $(OBJS3)                @@\
  641.             SRCS = $(SRCS1) $(SRCS2) $(SRCS3)                @@\
  642.                                     @@\
  643. AllTarget($(PROGRAMS))                            @@\
  644.                                     @@\
  645. ProgramTargetHelper(program,SRCS1,OBJS1,DEPLIBS1,locallib,syslib)    @@\
  646.                                     @@\
  647. DependTarget()                                @@\
  648. LintTarget()                                @@\
  649.                                     @@\
  650. clean::                                    @@\
  651.     RemoveFiles($(PROGRAMS))
  652. #endif /* ComplexProgramTarget_1 */
  653.  
  654. #ifndef ComplexCplusplusProgramTarget_1
  655. #define    ComplexCplusplusProgramTarget_1(program,locallib,syslib)    @@\
  656.             OBJS = $(OBJS1) $(OBJS2) $(OBJS3)                @@\
  657.             SRCS = $(SRCS1) $(SRCS2) $(SRCS3)                @@\
  658.                                     @@\
  659. AllTarget($(PROGRAMS))                            @@\
  660.                                     @@\
  661. CplusplusProgramTargetHelper(program,SRCS1,OBJS1,DEPLIBS1,locallib,syslib)@@\
  662.                                     @@\
  663. DependTarget()                                @@\
  664. LintTarget()                                @@\
  665.                                     @@\
  666. clean::                                    @@\
  667.     RemoveFiles($(PROGRAMS))
  668. #endif /* ComplexCplusplusProgramTarget_1 */
  669.  
  670. /*
  671.  * ComplexProgramTarget_2 - generate rules for compiling and linking the
  672.  * program specified by $(OBJS2) and $(SRCS2) and installing the program and
  673.  * man page.  It should be used to build the second program in Imakefiles 
  674.  * describing more than one program.
  675.  */
  676. #ifndef ComplexProgramTarget_2
  677. #define    ComplexProgramTarget_2(program,locallib,syslib)            @@\
  678. ProgramTargetHelper(program,SRCS2,OBJS2,DEPLIBS2,locallib,syslib)
  679. #endif /* ComplexProgramTarget_2 */
  680.  
  681. #ifndef ComplexCplusplusProgramTarget_2
  682. #define    ComplexCplusplusProgramTarget_2(program,locallib,syslib)    @@\
  683. CplusplusProgramTargetHelper(program,SRCS2,OBJS2,DEPLIBS2,locallib,syslib)
  684. #endif /* ComplexCplusplusProgramTarget_2 */
  685.  
  686. /*
  687.  * ComplexProgramTarget_3 - generate rules for compiling and linking the
  688.  * program specified by $(OBJS3) and $(SRCS3) and installing the program and
  689.  * man page.  It should be used to build the third program in Imakefiles 
  690.  * describing more than one program.
  691.  */
  692. #ifndef ComplexProgramTarget_3
  693. #define    ComplexProgramTarget_3(program,locallib,syslib)            @@\
  694. ProgramTargetHelper(program,SRCS3,OBJS3,DEPLIBS3,locallib,syslib)
  695. #endif /* ComplexProgramTarget_3 */
  696.  
  697. #ifndef ComplexCplusplusProgramTarget_3
  698. #define    ComplexCplusplusProgramTarget_3(program,locallib,syslib)    @@\
  699. CplusplusProgramTargetHelper(program,SRCS3,OBJS3,DEPLIBS3,locallib,syslib)
  700. #endif /* ComplexCplusplusProgramTarget_3 */
  701.  
  702. #ifndef MoveToBakFile
  703. #define MoveToBakFile(file) -@if [ -f file ]; then set -x; \        @@\
  704.     $(MV) file file.bak; else exit 0; fi
  705. #endif /* MoveToBakFile */
  706.  
  707. #ifndef RMoveToBakFile
  708. #define RMoveToBakFile(file) -@if [ -f file ]; then set -x; \        @@\
  709.     RemoveFile(file.bak); $(MV) file file.bak; \            @@\
  710.     else exit 0; fi
  711. #endif /* RMoveToBakFile */
  712.  
  713. /*
  714.  * ServerTargetWithFlags - generate rules to compile, link, and relink a server
  715.  */
  716. #ifndef ServerTargetWithFlags
  717. #define    ServerTargetWithFlags(server,subdirs,objects,libs,syslibs,flags) @@\
  718. AllTarget(server)                            @@\
  719. ProgramTargetName(server): subdirs objects libs                @@\
  720.     MoveToBakFile($@)                        @@\
  721.     LinkRule($@,$(LDOPTIONS),objects,libs $(LDLIBS) syslibs) @@\
  722.                                     @@\
  723. Concat(load,server):                            @@\
  724.     MoveToBakFile(ProgramTargetName(server))            @@\
  725.     LinkRule(ProgramTargetName(server),$(LDOPTIONS),objects,libs $(LDLIBS) syslibs) @@\
  726.                                     @@\
  727. loadX:: Concat(load,server)                        @@\
  728.                                     @@\
  729. SentinelProgramTarget(server,subdirs objects libs,objects libs $(LDLIBS) syslibs) @@\
  730. SentinelLinkTarget(Concat(load,server),server,objects libs $(LDLIBS) syslibs) @@\
  731. PurifyProgramTarget(server,subdirs objects libs,objects libs $(LDLIBS) syslibs) @@\
  732. PurifyLinkTarget(Concat(load,server),server,objects libs $(LDLIBS) syslibs) @@\
  733. ProofProgramTarget(server,subdirs objects libs,objects libs $(LDLIBS) syslibs) @@\
  734. ProofLinkTarget(Concat(load,server),server,objects libs $(LDLIBS) syslibs) @@\
  735.                                     @@\
  736. InstallProgramWithFlags(server,$(BINDIR),flags)                @@\
  737.                                     @@\
  738. clean::                                    @@\
  739.     RemoveFile(ProgramTargetName(server))
  740. #endif /* ServerTargetWithFlags */
  741.  
  742. /*
  743.  * ServerTarget - rules to compile, link, and relink a normal server
  744.  */
  745. #ifndef ServerTarget
  746. #define    ServerTarget(server,subdirs,objects,libs,syslibs)        @@\
  747. ServerTargetWithFlags(server,subdirs,objects,libs,syslibs,$(_NOOP_))
  748. #endif /* ServerTarget */
  749.  
  750. #if DoRanlibCmd
  751. #define RanLibrary(args) $(RANLIB) args
  752. #else
  753. #define RanLibrary(args) $(_NULLCMD_)
  754. #endif
  755.  
  756. #ifndef LibraryTargetName
  757. #define LibraryTargetName(libname)Concat(lib,libname.a)
  758. #endif
  759.  
  760. #ifndef LibraryTargetNameSuffix
  761. #define LibraryTargetNameSuffix(libname,suffix)Concat3(lib,libname,suffix.a)
  762. #endif
  763.  
  764. #ifndef InstallNamedTarget
  765. #define    InstallNamedTarget(step,srcname,flags,dest,dstname)        @@\
  766. step:: srcname                                @@\
  767.     MakeDir($(DESTDIR)dest)                        @@\
  768.     $(INSTALL) $(INSTALLFLAGS) flags srcname $(DESTDIR)dest/dstname
  769. #endif /* InstallNamedTarget */
  770.  
  771. #ifndef InstallTarget
  772. #define    InstallTarget(step,file,flags,dest)                @@\
  773. InstallNamedTarget(step,file,flags,dest,file)
  774. #endif /* InstallTarget */
  775.  
  776. /*
  777.  * InstallLibrary - generate rules to install the indicated library.
  778.  */
  779. #ifndef InstallLibrary
  780. #define    InstallLibrary(libname,dest)                    @@\
  781. install:: LibraryTargetName(libname)                    @@\
  782.     MakeDir($(DESTDIR)dest)                        @@\
  783.     $(INSTALL) $(INSTALLFLAGS) $(INSTLIBFLAGS) LibraryTargetName(libname) $(DESTDIR)dest @@\
  784.     RanLibrary($(RANLIBINSTFLAGS) $(DESTDIR)dest/LibraryTargetName(libname))
  785. #endif /* InstallLibrary */
  786.  
  787.  
  788. /*
  789.  * InstallLinkKitLibrary - rule to install Link Kit library.
  790.  *                         (only used for XFree86). This is a no-op
  791.  *                         rule so that Imakefiles on non-XFree86 systems
  792.  *                         continue to build Makefiles correctly.
  793.  */
  794. #ifndef InstallLinkKitLibrary
  795. #define InstallLinkKitLibrary(lib,dir)
  796. #endif
  797.  
  798.  
  799. /*
  800.  * InstallLinkKitNamedLibrary - rule to install Link Kit library.
  801.  *                         (only used for XFree86). This is a no-op
  802.  *                         rule so that Imakefiles on non-XFree86 systems
  803.  *                         continue to build Makefiles correctly.
  804.  */
  805. #ifndef InstallLinkKitNamedLibrary
  806. #define InstallLinkKitNamedLibrary(lib,dlib,dir)
  807. #endif
  808.  
  809.  
  810. /*
  811.  * MergeIntoInstalledLibrary - generate rules to merge one library into another
  812.  */
  813. #ifndef MergeIntoInstalledLibrary
  814. #define MergeIntoInstalledLibrary(tolib,fromlib)            @@\
  815. install::  fromlib                            @@\
  816.     $(SCRIPTSRC)/mergelib $(DESTDIR)tolib fromlib
  817. #endif /* MergeIntoInstalledLibrary */
  818.  
  819. /*
  820.  * InstallLibraryAlias - generate rules to create a link from one library name
  821.  * to another for the purposes of aliasing.
  822.  */
  823. #ifndef InstallLibraryAlias
  824. #define    InstallLibraryAlias(libname,alias,dest)                @@\
  825. install::                                @@\
  826.     -(cd $(DESTDIR)dest; \                        @@\
  827.         RemoveFile(LibraryTargetName(alias)); \            @@\
  828.         $(LN) LibraryTargetName(libname) LibraryTargetName(alias))
  829. #endif /* InstallLibraryAlias */
  830.  
  831.  
  832. /*
  833.  * InstallLintLibrary - generate rules to install the indicated lint library.
  834.  */
  835. #ifndef InstallLintLibrary
  836. #define    InstallLintLibrary(libname,dest)                @@\
  837. InstallTarget(install.ln,Concat(llib-l,libname.ln),$(INSTLIBFLAGS),dest)
  838. #endif /* InstallLintLibrary */
  839.  
  840.  
  841. /*
  842.  * InstallManPageLong - generate rules to install the indicated manual page,
  843.  * giving it an alternate name.  This is used for installing man pages whose
  844.  * base name without the .man suffix would normally be longer than 8 characters
  845.  * (the limit for using source code control systems on files systems with 
  846.  * short file names).
  847.  */
  848. #ifndef InstallManPageLong
  849. #define    InstallManPageLong(file,destdir,dest)                @@\
  850. InstallNamedTarget(install.man,file.man,$(INSTMANFLAGS),destdir,dest.$(MANSUFFIX))
  851. #endif /* InstallManPageLong */
  852.  
  853.  
  854. /*
  855.  * InstallManPage - generate rules to install the indicated manual page.
  856.  */
  857. #ifndef InstallManPage
  858. #define    InstallManPage(file,destdir)                    @@\
  859. InstallManPageLong(file,destdir,file)
  860. #endif /* InstallManPage */
  861.  
  862.  
  863. /*
  864.  * InstallManPageAliases - generate rules to install manual page aliases.
  865.  */
  866. #ifndef InstallManPageAliases
  867. #define    InstallManPageAliases(file,destdir,aliases)            @@\
  868. install.man::                                @@\
  869.     @(TMP=/tmp/tmp.$$$$; \                        @@\
  870.     RemoveFile($${TMP}); \                        @@\
  871.     echo .so `basename destdir`/file.$(MANSUFFIX) > $${TMP}; \    @@\
  872.     for i in aliases; do (set -x; \                    @@\
  873.     $(INSTALL) $(INSTALLFLAGS) $(INSTMANFLAGS) $${TMP} $(DESTDIR)destdir/$$i.$(MANSUFFIX)); \ @@\
  874.     done; \                                @@\
  875.     RemoveFile($${TMP}))
  876. #endif /* InstallManPageAliases */
  877.  
  878.  
  879. /*
  880.  * InstallNamedNonExec - generate rules to install a data file
  881.  */
  882. #ifndef InstallNamedNonExec
  883. #define    InstallNamedNonExec(srcname,dstname,dest)            @@\
  884. InstallNamedTarget(install,srcname,$(INSTDATFLAGS),dest,dstname)
  885. #endif /* InstallNamedNonExec */
  886.  
  887.  
  888. /*
  889.  * InstallNonExecFile - generate rules to install a data file
  890.  */
  891. #ifndef InstallNonExecFile
  892. #define    InstallNonExecFile(file,dest)                    @@\
  893. InstallTarget(install,file,$(INSTDATFLAGS),dest)
  894. #endif /* InstallNonExecFile */
  895.  
  896.  
  897. /*
  898.  * InstallLinkKitNonExecFile - rule for installing server Link Kit files.
  899.  *                         (only used for XFree86). This is a no-op
  900.  *                         rule so that Imakefiles on non-XFree86 systems
  901.  *                         continue to build Makefiles correctly.
  902.  */
  903. #ifndef InstallLinkKitNonExecFile
  904. #define InstallLinkKitNonExecFile(file,dir)
  905. #endif
  906.  
  907.  
  908. /*
  909.  * InstallNonExec - generate rules to install a data file, but does not
  910.  * try to create the destination directory (deprecated)
  911.  */
  912. #ifndef InstallNonExec
  913. #define    InstallNonExec(file,dest)                    @@\
  914. install:: file                                @@\
  915.     $(INSTALL) $(INSTALLFLAGS) $(INSTDATFLAGS) file $(DESTDIR)dest
  916. #endif /* InstallNonExec */
  917.  
  918.  
  919. /*
  920.  * InstallProgramWithFlags - generate rules to install an executable program
  921.  * using given install flags.
  922.  */
  923. #ifndef InstallProgramWithFlags
  924. #define InstallProgramWithFlags(program,dest,flags)            @@\
  925. InstallTarget(install,ProgramTargetName(program),$(INSTPGMFLAGS) flags,dest)
  926. #endif /* InstallProgramWithFlags */
  927.  
  928.  
  929. /*
  930.  * InstallProgram - generate rules to install an executable program using any
  931.  * special install flags set in $(INSTALLFLAGS).
  932.  */
  933. #ifndef InstallProgram
  934. #define    InstallProgram(program,dest)                    @@\
  935. InstallProgramWithFlags(program,dest,NullParameter)
  936. #endif /* InstallProgram */
  937.  
  938.  
  939.  
  940. /*
  941.  * InstallScript - install a shell script.
  942.  */
  943. #ifndef InstallScript
  944. #define    InstallScript(program,dest)                    @@\
  945. InstallNamedTarget(install,program.script,$(INSTBINFLAGS),dest,program)
  946. #endif /* InstallScript */
  947.  
  948.  
  949. /*
  950.  * InstallNamedProg - install a program with renaming and no stripping.
  951.  */
  952. #ifndef InstallNamedProg
  953. #define    InstallNamedProg(srcname,dstname,dest)                @@\
  954. InstallNamedTarget(install,srcname,$(INSTBINFLAGS),dest,dstname)
  955. #endif /* InstallNamedProg */
  956.  
  957.  
  958. /*
  959.  * LinkFileList - link a list of list of files from one place to another
  960.  */
  961. #ifndef LinkFileList
  962. #define LinkFileList(step,list,dir,sub)                    @@\
  963. step:: list                                @@\
  964.     @case '${MFLAGS}' in *[i]*) set +e;; esac; \            @@\
  965.     echo "    cd" dir; cd dir; \                    @@\
  966.     for i in list; do (set -x; RemoveFile($$i); $(LN) sub/$$i .); done
  967. #endif
  968.  
  969.  
  970. /*
  971.  * InstallMultipleDestFlags - generate rules to install multiple files at
  972.  * once during a particular step in the build using a specific set of install 
  973.  * flags.
  974.  */
  975. #ifndef InstallMultipleDestFlags
  976. #define InstallMultipleDestFlags(step,list,dest,flags)            @@\
  977. step:: list                                @@\
  978.     MakeDir($(DESTDIR)dest)                        @@\
  979.     @case '${MFLAGS}' in *[i]*) set +e;; esac; \            @@\
  980.     for i in list; do \                        @@\
  981.         (set -x; $(INSTALL) $(INSTALLFLAGS) flags $$i $(DESTDIR)dest); \    @@\
  982.     done
  983. #endif /* InstallMultipleDestFlags */
  984.  
  985.  
  986. /*
  987.  * InstallMultipleDest - generate rules to install multiple files at once
  988.  * during a particular step in the build using any install flags set in 
  989.  * $(INSTDATFLAGS).
  990.  */
  991. #ifndef InstallMultipleDest
  992. #define InstallMultipleDest(step,list,dest)                @@\
  993. InstallMultipleDestFlags(step,list,dest,$(INSTDATFLAGS))
  994. #endif /* InstallMultipleDest */
  995.  
  996. /*
  997.  * InstallMultiple - generate rules to install multiple files at once 
  998.  * during the install step of the build using any install flags set in 
  999.  * $(INSTALLFLAGS).
  1000.  */
  1001. #ifndef InstallMultiple
  1002. #define    InstallMultiple(list,dest)                    @@\
  1003. InstallMultipleDest(install,list,dest)
  1004. #endif /* InstallMultiple */
  1005.  
  1006.  
  1007. /*
  1008.  * InstallMultipleFlags - generate rules to install multiple files at once
  1009.  * during the install step of the build using the given install flags.
  1010.  */
  1011. #ifndef InstallMultipleFlags
  1012. #define InstallMultipleFlags(list,dest,flags)                @@\
  1013. InstallMultipleDestFlags(install,list,dest,flags)
  1014. #endif /* InstallMultipleFlags */
  1015.  
  1016.  
  1017. /*
  1018.  * InstallMultipleMan - generate rules to install a variety of manual pages
  1019.  * during the install.man step of the build.
  1020.  */
  1021. #ifndef InstallMultipleMan
  1022. #define InstallMultipleMan(list,dest)                    @@\
  1023. InstallMultipleDestFlags(install.man,list,dest,$(INSTMANFLAGS))
  1024. #endif /* InstallMultipleMan */
  1025.  
  1026.  
  1027. /*
  1028.  * DependDependency - generate rules to build the makedepend program if 
  1029.  * this Imakefile is within the source tree.
  1030.  */
  1031. #ifndef DependDependency
  1032. #ifdef UseInstalled
  1033. #define DependDependency() /**/
  1034. #else
  1035. #define DependDependency()                         @@\
  1036. depend:: ProgramTargetName($(DEPEND))                    @@\
  1037.                                     @@\
  1038. ProgramTargetName($(DEPEND)):                        @@\
  1039.     @echo "checking $@ over in $(DEPENDSRC) first..."; \        @@\
  1040.     cd $(DEPENDSRC); $(MAKE); \                    @@\
  1041.     echo "okay, continuing in $(CURRENT_DIR)"
  1042.  
  1043. #endif /* UseInstalled */
  1044. #endif /* DependDependency */
  1045.  
  1046. /*
  1047.  * IxxDependency - generate rules to build the interface translator if 
  1048.  * this Imakefile is within the source tree.
  1049.  */
  1050. #ifndef IxxDependency
  1051. #ifdef UseInstalled
  1052. #define IxxDependency() /**/
  1053. #else
  1054. #define IxxDependency()                            @@\
  1055. depend filter headers type_ids.filter:: ProgramTargetName($(IXX))    @@\
  1056.                                     @@\
  1057. ProgramTargetName($(IXX)):                        @@\
  1058.     @echo "checking $@ over in $(IXXSRC) first..."; \        @@\
  1059.     cd $(IXXSRC); $(MAKE) $(MFLAGS) ixx; \                @@\
  1060.     echo "okay, continuing in $(CURRENT_DIR)"
  1061. #endif /* UseInstalled */
  1062. #endif /* IxxDependency */
  1063.  
  1064. /*
  1065.  * DependTarget - generate rules to compute dependencies for all files listed
  1066.  * in $(SRCS).
  1067.  */
  1068. #ifndef DependTarget
  1069. #define    DependTarget()                            @@\
  1070. DependDependency()                            @@\
  1071.                                     @@\
  1072. depend::                                @@\
  1073.     RunProgram(DEPEND,$(DEPENDFLAGS) -- $(ALLDEFINES) $(DEPEND_DEFINES) -- $(SRCS))
  1074. #endif /* DependTarget */
  1075.  
  1076. /*
  1077.  * DependTarget3 - generate rules to compute dependencies for all files given.
  1078.  */
  1079. #ifndef DependTarget3
  1080. #define    DependTarget3(srcs1,srcs2,srcs3)                @@\
  1081. DependDependency()                            @@\
  1082.                                     @@\
  1083. depend::                                @@\
  1084.     RunProgram(DEPEND,$(DEPENDFLAGS) -- $(ALLDEFINES) $(DEPEND_DEFINES) -- srcs1)    @@\
  1085.     RunProgram(DEPEND,-a $(DEPENDFLAGS) -- $(ALLDEFINES) $(DEPEND_DEFINES) -- srcs2)    @@\
  1086.     RunProgram(DEPEND,-a $(DEPENDFLAGS) -- $(ALLDEFINES) $(DEPEND_DEFINES) -- srcs3)
  1087. #endif /* DependTarget3 */
  1088.  
  1089.  
  1090. /*
  1091.  * CleanTarget - generate rules to remove any garbage files
  1092.  */
  1093. #ifndef CleanTarget
  1094. #define    CleanTarget()                            @@\
  1095. clean::                                    @@\
  1096.     $(RM_CMD) FilesToClean ExtraFilesToClean "#"*            @@\
  1097.                                     @@\
  1098. ProofCleanTarget()
  1099. #endif /* CleanTarget */
  1100.  
  1101.  
  1102. /*
  1103.  * TagsTarget - generate rules to compute tags files for C source code.
  1104.  */
  1105. #ifndef TagsTarget
  1106. #define    TagsTarget()                            @@\
  1107. tags::                                    @@\
  1108.     $(TAGS) -w *.[ch]                        @@\
  1109.     $(TAGS) -xw *.[ch] > TAGS
  1110. #endif /* TagsTarget */
  1111.  
  1112.  
  1113. /*
  1114.  * ImakeDependency - generate rules to compile imake if this Imakefile is
  1115.  * within the source tree.
  1116.  */
  1117. #ifndef ImakeDependency
  1118. #ifdef UseInstalled
  1119. #define ImakeDependency(target) /**/
  1120. #else
  1121. #define ImakeDependency(target)                        @@\
  1122. target:: ProgramTargetName($(IMAKE))                    @@\
  1123.                                     @@\
  1124. ProgramTargetName($(IMAKE)):                        @@\
  1125.     -@(cd $(IMAKESRC); if [ -f Makefile ]; then \            @@\
  1126.     echo "checking $@ in $(IMAKESRC) first..."; $(MAKE) all; else \    @@\
  1127.     echo "bootstrapping $@ from Makefile.ini in $(IMAKESRC) first..."; \    @@\
  1128.     $(MAKE) -f Makefile.ini BOOTSTRAPCFLAGS="$(BOOTSTRAPCFLAGS)"; fi; \    @@\
  1129.     echo "okay, continuing in $(CURRENT_DIR)")
  1130. #endif /* UseInstalled */
  1131. #endif /* ImakeDependency */
  1132.  
  1133.  
  1134. /*
  1135.  * BuildMakefileTarget - generate rules to build a Makefile from an Imakefile
  1136.  * and any special imake flags.  This is generally done automatically by the
  1137.  * template or by any special Imakefiles.  The first argument exists just
  1138.  * because imakeflags is usually empty and some preprocessors will complain
  1139.  * if an empty argument is passed as the sole argument to a macro.
  1140.  */
  1141. #ifndef BuildMakefileTarget
  1142. #define    BuildMakefileTarget(notused,imakeflags)                @@\
  1143. ImakeDependency(Makefile)                        @@\
  1144.                                     @@\
  1145. Makefile::                                 @@\
  1146.     RMoveToBakFile(Makefile)                    @@\
  1147.     $(IMAKE_CMD) -DTOPDIR=$(TOP) -DCURDIR=$(CURRENT_DIR) imakeflags
  1148.  
  1149. #endif /* BuildMakefileTarget */
  1150.  
  1151.  
  1152. /*
  1153.  * MakefileTarget - generate rules to build a normal Makefile.
  1154.  */
  1155. #ifndef MakefileTarget
  1156. #define MakefileTarget()                        @@\
  1157. BuildMakefileTarget(Imakefile,NullParameter)
  1158. #endif /* MakefileTarget */
  1159.  
  1160.  
  1161. /*
  1162.  * LibMkdir - helper for creating library object subdirectories
  1163.  */
  1164. #ifndef LibMkdir
  1165. #define LibMkdir(dir) DirFailPrefix@if [ -d dir ]; then exit 0; else set -x; mkdir dir; fi
  1166. #endif
  1167.  
  1168. /*
  1169.  * LibCleanDir - helper for cleaning library object subdirectories
  1170.  */
  1171. #ifndef LibCleanDir
  1172. #define LibCleanDir(dir) -@if [ -d dir ]; then \            @@\
  1173.         (set -x; cd dir; RemoveFiles(*.Osuf)); else exit 0; fi
  1174. #endif
  1175.  
  1176. /*
  1177.  * LintLibReferences - variables for lint libraries
  1178.  */
  1179. #ifndef LintLibReferences
  1180. #define LintLibReferences(varname,libname,libsource)            @@\
  1181. Concat(LINT,varname) = _UseCat($(LINTLIBDIR)/llib-l,libsource/llib-,libname.ln)
  1182. #endif
  1183.  
  1184. /*
  1185.  * UnsharedLibReferences - variables for unshared libraries
  1186.  */
  1187. #ifndef UnsharedLibReferences
  1188. #define UnsharedLibReferences(varname,libname,libsource)        @@\
  1189. Concat3(DEP,varname,LIB) = _UseCat($(USRLIBDIR)/lib,$(BUILDLIBDIR)/lib,libname.a)    @@\
  1190. Concat(varname,LIB) = LoaderLibPrefix Concat(-l,libname)        @@\
  1191. LintLibReferences(varname,libname,libsource)
  1192. #endif
  1193.  
  1194. /*
  1195.  * SharedLibDependencies - shared library dependencies
  1196.  */
  1197. #ifndef SharedLibDependencies
  1198. #define SharedLibDependencies(libname,libsource,revname) /**/
  1199. #endif
  1200.  
  1201. /*
  1202.  * SharedDSLibDependencies - shared library dependencies with data separation
  1203.  */
  1204. #ifndef SharedDSLibDependencies
  1205. #define SharedDSLibDependencies(libname,libsource,revname) /**/
  1206. #endif
  1207.  
  1208. /*
  1209.  * SharedLibReferences - variables for shared libraries
  1210.  */
  1211. #ifndef SharedLibReferences
  1212. #define SharedLibReferences(varname,libname,libsource,revname,rev)    @@\
  1213. revname = rev                                @@\
  1214. Concat3(DEP,varname,LIB) = SharedLibDependencies(libname,libsource,revname) @@\
  1215. Concat(varname,LIB) = LoaderLibPrefix Concat(-l,libname)        @@\
  1216. LintLibReferences(varname,libname,libsource)
  1217. #endif
  1218.  
  1219. /*
  1220.  * SharedDSLibReferences - variables for shared libraries
  1221.  */
  1222. #ifndef SharedDSLibReferences
  1223. #define SharedDSLibReferences(varname,libname,libsource,revname,rev)    @@\
  1224. revname = rev                                @@\
  1225. Concat3(DEP,varname,LIB) = SharedDSLibDependencies(libname,libsource,revname) @@\
  1226. Concat(varname,LIB) = LoaderLibPrefix Concat(-l,libname)        @@\
  1227. LintLibReferences(varname,libname,libsource)
  1228. #endif
  1229.  
  1230. /*
  1231.  * CPPOnlyCompile - run C compiler's preprocessor only
  1232.  */
  1233. #ifndef CPPOnlyCompile
  1234. #define CPPOnlyCompile(src,options) RemoveFile($@)            @@\
  1235.     $(CC) -E $(CFLAGS) options src > $@
  1236. #endif
  1237.  
  1238. /*
  1239.  * ObjectCompile - compile fragment for a normal object file
  1240.  */
  1241. #ifndef ObjectCompile
  1242. #define ObjectCompile(options) RemoveFile($@)                @@\
  1243.     $(CC) -c $(CFLAGS) options $*.c
  1244. #endif
  1245.  
  1246. #ifndef ObjectCplusplusCompile
  1247. #define ObjectCplusplusCompile(options) RemoveFile($@)            @@\
  1248.     $(CXX) -c $(CXXFLAGS) options $*.CCsuf
  1249. #endif
  1250.  
  1251. /*
  1252.  * NormalLibObjCompile - compile fragment for a normal library object file
  1253.  */
  1254. #ifndef NormalLibObjCompile
  1255. #define NormalLibObjCompile(options) ObjectCompile(options)
  1256. #endif
  1257.  
  1258. #ifndef NormalLibObjCplusplusCompile
  1259. #define NormalLibObjCplusplusCompile(options) ObjectCplusplusCompile(options)
  1260. #endif
  1261.  
  1262. /*
  1263.  * NormalSharedLibObjCompile - compile fragment for shared objects
  1264.  */
  1265. #ifndef NormalSharedLibObjCompile
  1266. #define NormalSharedLibObjCompile(options) NormalLibObjCompile(options $(SHLIBDEF) $(SHAREDCODEDEF) $(PICFLAGS))
  1267. #endif
  1268.  
  1269. #ifndef NormalSharedLibObjCplusplusCompile
  1270. #define NormalSharedLibObjCplusplusCompile(options) NormalLibObjCplusplusCompile(options $(SHLIBDEF) $(SHAREDCODEDEF) $(CXXPICFLAGS))
  1271. #endif
  1272.  
  1273. /*
  1274.  * LibObjCompile - compile fragment for unshared/profiled/debugged objects
  1275.  */
  1276. #ifndef LibObjCompile
  1277. #define LibObjCompile(dir,options) RemoveFiles($@ dir/$@)        @@\
  1278.     $(CC) -c $(CCOPTIONS) $(ALLDEFINES) options $*.c        @@\
  1279.     $(MV) $@ dir/$@
  1280. #endif
  1281.  
  1282. #ifndef LibObjCplusplusCompile
  1283. #define LibObjCplusplusCompile(dir,options) RemoveFiles($@ dir/$@)    @@\
  1284.     $(CXX) -c $(CXXOPTIONS) $(CXXDEFINES) options $*.CCsuf        @@\
  1285.     $(MV) $@ dir/$@
  1286. #endif
  1287.  
  1288. /*
  1289.  * DebuggedLibObjCompile - compile fragment for debugged objects
  1290.  */
  1291. #ifndef DebuggedLibObjCompile
  1292. #define DebuggedLibObjCompile(options) LibObjCompile(debugger,DebuggableCDebugFlags options)
  1293. #endif
  1294.  
  1295. #ifndef DebuggedLibObjCplusplusCompile
  1296. #define DebuggedLibObjCplusplusCompile(options) LibObjCplusplusCompile(debugger,DebuggableCplusplusDebugFlags options)
  1297. #endif
  1298.  
  1299. /*
  1300.  * ProfiledLibObjCompile - compile fragment for profiled objects
  1301.  */
  1302. #ifndef ProfiledLibObjCompile
  1303. #define ProfiledLibObjCompile(options) LibObjCompile(profiled,ProfiledCDebugFlags options)
  1304. #endif
  1305.  
  1306. #ifndef ProfiledLibObjCplusplusCompile
  1307. #define ProfiledLibObjCplusplusCompile(options) LibObjCplusplusCompile(profiled,ProfiledCplusplusDebugFlags options)
  1308. #endif
  1309.  
  1310. /*
  1311.  * UnsharedLibObjCompile - compile fragment for unshared objects
  1312.  */
  1313. #ifndef UnsharedLibObjCompile
  1314. #define UnsharedLibObjCompile(options) LibObjCompile(unshared,$(CDEBUGFLAGS) options)
  1315. #endif
  1316.  
  1317. #ifndef UnsharedLibObjCplusplusCompile
  1318. #define UnsharedLibObjCplusplusCompile(options) LibObjCplusplusCompile(unshared,$(CXXDEBUGFLAGS) options)
  1319. #endif
  1320.  
  1321. /*
  1322.  * SharedLibObjCompile - compile fragment for shared objects
  1323.  */
  1324. #ifndef SharedLibObjCompile
  1325. #define SharedLibObjCompile(options) LibObjCompile(shared,options $(SHLIBDEF) $(SHAREDCODEDEF) $(PICFLAGS) $(CDEBUGFLAGS))
  1326. #endif
  1327.  
  1328. /*
  1329.  * NormalLibraryObjectRule - for simple libraries
  1330.  */
  1331. #ifndef NormalLibraryObjectRule
  1332. #define    NormalLibraryObjectRule()                    @@\
  1333. .c.Osuf:                                @@\
  1334.     NormalLibObjCompile($(_NOOP_))
  1335. #endif /* NormalLibraryObjectRule */
  1336.  
  1337. #ifndef NormalCplusplusObjectRule
  1338. #define NormalCplusplusObjectRule()                    @@\
  1339. .CCsuf.Osuf:                                @@\
  1340.     NormalLibObjCplusplusCompile($(_NOOP_))
  1341. #endif
  1342.  
  1343. #ifndef NormalFortranObjectRule
  1344. #define NormalFortranObjectRule()                    @@\
  1345. .f.Osuf:                                @@\
  1346.     RemoveFile($@)                            @@\
  1347.     $(FC) -c $(FCFLAGS) $*.f
  1348. #endif
  1349.  
  1350. /*
  1351.  * SpecialObjectRule - generate rules to compile a file with special flags.
  1352.  */
  1353. #ifndef SpecialObjectRule
  1354. #define SpecialObjectRule(objs,depends,options)                @@\
  1355. objs:    depends                                @@\
  1356.     ObjectCompile(options)
  1357. #endif /* SpecialObjectRule */
  1358.  
  1359. #ifndef SpecialCplusplusObjectRule
  1360. #define SpecialCplusplusObjectRule(baseobj,basedep,options)        @@\
  1361. baseobj.Osuf:    basedep.CCsuf                        @@\
  1362.     ObjectCplusplusCompile(options)
  1363. #endif /* SpecialCplusplusObjectRule */
  1364.  
  1365. /*
  1366.  * NormalCplusplusObject - compile a normal C++ object.
  1367.  */
  1368. #ifndef NormalCplusplusObject
  1369. #define NormalCplusplusObject(baseobj,basedep)                @@\
  1370. SpecialCplusplusObject(baseobj,basedep,$(_NOOP_))
  1371. #endif
  1372.  
  1373. #ifndef NormalCplusplusObjectRename
  1374. #define NormalCplusplusObjectRename(baseobj,basedep)            @@\
  1375. SpecialCplusplusObjectRename(baseobj,basedep,$(_NOOP_))
  1376. #endif
  1377.  
  1378. #ifndef SpecialCplusplusObject
  1379. #define SpecialCplusplusObject(baseobj,basedep,options)            @@\
  1380. baseobj.Osuf: basedep.CCsuf                        @@\
  1381.     RemoveFile($@)                            @@\
  1382.     $(CXX) -c $(CXXFLAGS) options basedep.CCsuf
  1383. #endif
  1384.  
  1385. #ifndef SpecialCplusplusObjectRename
  1386. #if HasCplusplusMinusCMinusO
  1387. #define SpecialCplusplusObjectRename(baseobj,basedep,options)        @@\
  1388. baseobj.Osuf: basedep.CCsuf                        @@\
  1389.     RemoveFile($@)                            @@\
  1390.     $(CXX) -c $(CXXFLAGS) options basedep.CCsuf -o $@
  1391. #else
  1392. /* If your make doesn't implement $(*F), try using $* instead or
  1393.    defining HasCplusplusMinusCMinusO YES in site.def. */
  1394. #define SpecialCplusplusObjectRename(baseobj,basedep,options)        @@\
  1395. baseobj.Osuf: basedep.CCsuf                        @@\
  1396.     RemoveFile($@)                            @@\
  1397.     $(CXX) -c $(CXXFLAGS) options basedep.CCsuf            @@\
  1398.     $(MV) $(*F).Osuf $@
  1399. #endif
  1400. #endif
  1401.  
  1402. /*
  1403.  * NormalSharedCplusplusObject - compile a shared C++ object.
  1404.  */
  1405. #ifndef NormalSharedCplusplusObject
  1406. #define NormalSharedCplusplusObject(baseobj,basedep)            @@\
  1407. SpecialSharedCplusplusObject(baseobj,basedep,$(_NOOP_))
  1408. #endif
  1409.  
  1410. #ifndef NormalSharedCplusplusObjectRename
  1411. #define NormalSharedCplusplusObjectRename(baseobj,basedep)        @@\
  1412. SpecialSharedCplusplusObjectRename(baseobj,basedep,$(_NOOP_))
  1413. #endif
  1414.  
  1415. #ifndef SpecialSharedCplusplusObject
  1416. #define SpecialSharedCplusplusObject(baseobj,basedep,options)        @@\
  1417. baseobj.Osuf: basedep.CCsuf                        @@\
  1418.     RemoveFile($@)                            @@\
  1419.     $(CXX) -c $(CXXFLAGS) options $(SHLIBDEF) $(SHAREDCODEDEF) $(CXXPICFLAGS) basedep.CCsuf
  1420. #endif
  1421.  
  1422. #ifndef SpecialSharedCplusplusObjectRename
  1423. #if HasCplusplusMinusCMinusO
  1424. #define SpecialSharedCplusplusObjectRename(baseobj,basedep,options)    @@\
  1425. baseobj.Osuf: basedep.CCsuf                        @@\
  1426.     RemoveFile($@)                            @@\
  1427.     $(CXX) -c $(CXXFLAGS) options $(SHLIBDEF) $(SHAREDCODEDEF) $(CXXPICFLAGS) basedep.CCsuf -o $@
  1428. #else
  1429. /* If your make doesn't implement $(*F), try using $* instead or
  1430.    defining HasCplusplusMinusCMinusO YES in site.def. */
  1431. #define SpecialSharedCplusplusObjectRename(baseobj,basedep,options)    @@\
  1432. baseobj.Osuf: basedep.CCsuf                        @@\
  1433.     RemoveFile($@)                            @@\
  1434.     $(CXX) -c $(CXXFLAGS) options $(SHLIBDEF) $(SHAREDCODEDEF) $(CXXPICFLAGS) basedep.CCsuf @@\
  1435.     $(MV) $(*F).Osuf $@
  1436. #endif
  1437. #endif
  1438.  
  1439. /*
  1440.  * SpecialCObjectRule - generate rules to compile a C file with special flags.
  1441.  *            also handles CodeCenter rules
  1442.  */
  1443. #ifndef SpecialCObjectRule
  1444. #define SpecialCObjectRule(basename,depends,options)            @@\
  1445. SpecialObjectRule(basename.Osuf,basename.c depends,options)        @@\
  1446.                                     @@\
  1447. basename.i: basename.c depends                        @@\
  1448.     CPPOnlyCompile(basename.c,options)                @@\
  1449.                                     @@\
  1450. CenterLoadTarget(debug_src,basename.c,NullParameter,$(ALLDEFINES) options)
  1451. #endif /* SpecialCObjectRule */
  1452.  
  1453.  
  1454. #ifndef ObjectFromSpecialSource
  1455. #define ObjectFromSpecialSource(dst,src,flags)                @@\
  1456. dst.c:  src.c                                @@\
  1457.     RemoveFile($@)                            @@\
  1458.     $(LN) $? $@                            @@\
  1459.                                     @@\
  1460. SpecialCObjectRule(dst,NullParameter,flags)                @@\
  1461.                                     @@\
  1462. depend::  dst.c                                @@\
  1463.                                     @@\
  1464. clean::                                    @@\
  1465.     RemoveFile(dst.c)
  1466. #endif /* ObjectFromSpecialSource */
  1467.  
  1468.  
  1469. #ifndef LexFile
  1470. #define LexFile(file)                            @@\
  1471. depend:: file.c                                @@\
  1472.                                     @@\
  1473. clean::                                    @@\
  1474.     RemoveFiles(lex.yy.c file.c)
  1475. #endif /* LexFile */
  1476.  
  1477. #ifndef YaccFile
  1478. #define YaccFile(file,flags)                        @@\
  1479. depend:: file.c                                @@\
  1480.                                     @@\
  1481. file.h file.c: file.y                            @@\
  1482.     $(YACC) flags file.y                        @@\
  1483.     $(MV) y.tab.c file.c                        @@\
  1484.     $(MV) y.tab.h file.h                        @@\
  1485.                                     @@\
  1486. clean::                                    @@\
  1487.     RemoveFiles(y.tab.c y.tab.h file.h file.c)
  1488. #endif /* YaccFile */
  1489.  
  1490. #ifndef MakeHFromIDL
  1491. #define MakeHFromIDL(name,flags)                    @@\
  1492.                                     @@\
  1493. interfaces:: name.h                            @@\
  1494.                                     @@\
  1495. name.h: name.idl                            @@\
  1496.     @RemoveFile(name.h)                        @@\
  1497.     $(CPP) $(CXXDEFINES) name.idl | \                @@\
  1498.     $(IXX) $(IXXFLAGS) $(IXXINCLUDES) -file name.idl flags > name.h
  1499. #endif /* MakeHFromIDL */
  1500.  
  1501. #ifndef MakeLibrary
  1502. #define MakeLibrary(libname,objlist) $(AR) libname objlist
  1503. #endif
  1504.  
  1505. #ifndef LinkBuildLibrary
  1506. #ifdef UseInstalled
  1507. #define LinkBuildLibrary(lib) $(_NULLCMD_)
  1508. #else
  1509. #define LinkBuildLibrary(lib) MakeDir($(BUILDLIBDIR))            @@\
  1510.     RemoveFile($(BUILDLIBDIR)/lib)                    @@\
  1511.     cd $(BUILDLIBDIR); $(LN) $(BUILDINCTOP)/$(CURRENT_DIR)/lib .
  1512. #endif
  1513. #endif /* LinkBuildLibrary */
  1514.  
  1515. #ifndef _LinkBuildLibrary /* will get redefined elsewhere */
  1516. #define _LinkBuildLibrary(lib) $(_NULLCMD_)
  1517. #endif /* _LinkBuildLibrary */
  1518.  
  1519. /*
  1520.  * NormalLibraryTarget - generate rules to create a library.
  1521.  */
  1522. #ifndef NormalLibraryTarget
  1523. #define    NormalLibraryTarget(libname,objlist)                @@\
  1524. AllTarget(LibraryTargetName(libname))                    @@\
  1525.                                     @@\
  1526. LibraryTargetName(libname): objlist                    @@\
  1527.     RemoveFile($@)                            @@\
  1528.     MakeLibrary($@,objlist)                        @@\
  1529.     RanLibrary($@)                            @@\
  1530.     _LinkBuildLibrary($@)
  1531. #endif /* NormalLibraryTarget */
  1532.  
  1533.  
  1534. /*
  1535.  * NormalLibraryTarget2 - generate rules to create a library in two steps.
  1536.  * This is used to create libraries with large numbers of files.
  1537.  */
  1538. #ifndef NormalLibraryTarget2
  1539. #define    NormalLibraryTarget2(libname,objlist1,objlist2)            @@\
  1540. AllTarget(LibraryTargetName(libname))                    @@\
  1541.                                     @@\
  1542. LibraryTargetName(libname): objlist1 objlist2                @@\
  1543.     RemoveFile($@)                            @@\
  1544.     MakeLibrary($@,objlist1)                    @@\
  1545.     MakeLibrary($@,objlist2)                    @@\
  1546.     RanLibrary($@)                            @@\
  1547.     _LinkBuildLibrary($@)
  1548. #endif /* NormalLibraryTarget2 */
  1549.  
  1550.  
  1551. /*
  1552.  * NormalLibraryTarget3 - generate rules to create a library in three steps.
  1553.  * This is used to create libraries with very large numbers of files.
  1554.  */
  1555. #ifndef NormalLibraryTarget3
  1556. #define    NormalLibraryTarget3(libname,objlist1,objlist2,objlist3)    @@\
  1557. AllTarget(LibraryTargetName(libname))                    @@\
  1558.                                     @@\
  1559. LibraryTargetName(libname): objlist1 objlist2 objlist3            @@\
  1560.     RemoveFile($@)                            @@\
  1561.     MakeLibrary($@,objlist1)                    @@\
  1562.     MakeLibrary($@,objlist2)                    @@\
  1563.     MakeLibrary($@,objlist3)                    @@\
  1564.     RanLibrary($@)                            @@\
  1565.     _LinkBuildLibrary($@)
  1566. #endif /* NormalLibraryTarget3 */
  1567.  
  1568.  
  1569. /*
  1570.  * NormalDepLibraryTarget - generate rules to create a library.
  1571.  */
  1572. #ifndef NormalDepLibraryTarget
  1573. #define    NormalDepLibraryTarget(libname,deplist,objlist)            @@\
  1574. AllTarget(LibraryTargetName(libname))                    @@\
  1575.                                     @@\
  1576. LibraryTargetName(libname): deplist                    @@\
  1577.     RemoveFile($@)                            @@\
  1578.     MakeLibrary($@,objlist)                        @@\
  1579.     RanLibrary($@)                            @@\
  1580.     _LinkBuildLibrary($@)
  1581. #endif /* NormalDepLibraryTarget */
  1582.  
  1583.  
  1584. /*
  1585.  * UnsharedLibraryTarget - generate rules to create a library.
  1586.  */
  1587. #ifndef UnsharedLibraryTarget
  1588. #define    UnsharedLibraryTarget(libname,objlist,down,up)            @@\
  1589. AllTarget(LibraryTargetName(libname))                    @@\
  1590.                                     @@\
  1591. LibraryTargetName(libname): objlist                    @@\
  1592.     RemoveFile($@)                            @@\
  1593.     (cd down; MakeLibrary(up/$@,objlist))                @@\
  1594.     RanLibrary($@)                            @@\
  1595.     _LinkBuildLibrary($@)
  1596. #endif /* UnsharedLibraryTarget */
  1597.  
  1598.  
  1599. /*
  1600.  * UnsharedLibraryTarget3 - generate rules to create a library in three steps.
  1601.  * This is used to create libraries with very large numbers of files.
  1602.  */
  1603. #ifndef UnsharedLibraryTarget3
  1604. #define    UnsharedLibraryTarget3(libname,objlist1,objlist2,objlist3,down,up) @@\
  1605. AllTarget(LibraryTargetName(libname))                    @@\
  1606.                                     @@\
  1607. LibraryTargetName(libname): objlist1 objlist2 objlist3            @@\
  1608.     RemoveFile($@)                            @@\
  1609.     (cd down; MakeLibrary(up/$@,objlist1))                @@\
  1610.     (cd down; MakeLibrary(up/$@,objlist2))                @@\
  1611.     (cd down; MakeLibrary(up/$@,objlist3))                @@\
  1612.     RanLibrary($@)                            @@\
  1613.     _LinkBuildLibrary($@)
  1614. #endif /* UnsharedLibraryTarget3 */
  1615.  
  1616.  
  1617. /*
  1618.  * SubdirLibraryRule -
  1619.  */
  1620. #ifndef SubdirLibraryRule
  1621. #define    SubdirLibraryRule(objlist)                    @@\
  1622. all:: DONE                                @@\
  1623.                                     @@\
  1624. DONE: objlist                                @@\
  1625.     RemoveFile($@)                            @@\
  1626.     touch $@                            @@\
  1627.                                     @@\
  1628. clean::                                    @@\
  1629.     RemoveFile(DONE)
  1630. #endif /* SubdirLibraryRule */
  1631.  
  1632.  
  1633. /*
  1634.  * ProfiledLibraryTarget - generate rules to create a profiled library.
  1635.  */
  1636. #ifndef ProfiledLibraryTarget
  1637. #define    ProfiledLibraryTarget(libname,objlist)                @@\
  1638. AllTarget(LibraryTargetNameSuffix(libname,_p))                @@\
  1639.                                     @@\
  1640. LibraryTargetNameSuffix(libname,_p): objlist                @@\
  1641.     RemoveFile($@)                            @@\
  1642.     cd profiled; MakeLibrary(../$@,objlist)                @@\
  1643.     RanLibrary($@)
  1644.  
  1645. #endif /* ProfiledLibraryTarget */
  1646.  
  1647.  
  1648. /*
  1649.  * DebuggedLibraryTarget - generate rules to create a debuggable library.
  1650.  */
  1651. #ifndef DebuggedLibraryTarget
  1652. #define    DebuggedLibraryTarget(libname,objlist)                @@\
  1653. AllTarget(LibraryTargetNameSuffix(libname,_d))                @@\
  1654.                                     @@\
  1655. LibraryTargetNameSuffix(libname,_d): objlist                @@\
  1656.     RemoveFile($@)                            @@\
  1657.     cd debugger; MakeLibrary(../$@,objlist)                @@\
  1658.     RanLibrary($@)
  1659.  
  1660. #endif /* DebuggedLibraryTarget */
  1661.  
  1662.  
  1663. /*
  1664.  * AliasedLibraryTarget - generate rules to link one library to another.
  1665.  */
  1666. #ifndef AliasedLibraryTarget
  1667. #define    AliasedLibraryTarget(libname,alias)                @@\
  1668. AllTarget(LibraryTargetName(alias))                    @@\
  1669.                                     @@\
  1670. LibraryTargetName(alias): LibraryTargetName(libname)            @@\
  1671.     RemoveFile($@)                            @@\
  1672.     $(LN) LibraryTargetName(libname) $@                @@\
  1673.                                     @@\
  1674. clean::                                    @@\
  1675.     RemoveFile(LibraryTargetName(alias))
  1676. #endif /* AliasedLibraryTarget */
  1677.  
  1678.  
  1679. /*
  1680.  * NormalRelocatableTarget - generate rules to produce a relocatable object
  1681.  * file instead of a library.  
  1682.  */
  1683. #ifndef NormalRelocatableTarget
  1684. #define    NormalRelocatableTarget(objname,objlist)            @@\
  1685. AllTarget(objname.Osuf)                            @@\
  1686.                                     @@\
  1687. objname.Osuf: objlist                            @@\
  1688.     RemoveFile($@)                            @@\
  1689.     $(LD) $(LDCOMBINEFLAGS) objlist -o $@
  1690. #endif /* NormalRelocatableTarget */
  1691.  
  1692.  
  1693. /*
  1694.  * ProfiledRelocatableTarget - generate rules to produce a profiled relocatable
  1695.  * object file instead of a library.
  1696.  */
  1697. #ifndef ProfiledRelocatableTarget
  1698. #define    ProfiledRelocatableTarget(objname,objlist)            @@\
  1699. AllTarget(Concat(objname,_p.Osuf))                    @@\
  1700.                                     @@\
  1701. Concat(objname,_p.Osuf): objlist                    @@\
  1702.     RemoveFile($@)                            @@\
  1703.     $(LD) -X -r objlist -o $@
  1704.  
  1705. #endif /* ProfiledRelocatableTarget */
  1706.  
  1707.  
  1708. /*
  1709.  * DebuggedRelocatableTarget - generate rules to produce a debuggable 
  1710.  * relocatable object file instead of a library.
  1711.  */
  1712. #ifndef DebuggedRelocatableTarget
  1713. #define    DebuggedRelocatableTarget(objname,objlist)            @@\
  1714. AllTarget(Concat(objname,_d.Osuf))                    @@\
  1715.                                     @@\
  1716. Concat(objname,_d.Osuf): objlist                    @@\
  1717.     RemoveFile($@)                            @@\
  1718.     $(LD) -X -r objlist -o $@
  1719.  
  1720. #endif /* DebuggedRelocatableTarget */
  1721.  
  1722.  
  1723. /*
  1724.  * LintLibraryTarget - generate rules to create a lint library.  Note that the
  1725.  * lint library is always forced to be newer than the library itself.
  1726.  */
  1727. #ifndef LintLibraryTarget
  1728. #define    LintLibraryTarget(libname,srclist)                @@\
  1729. lintlib:: Concat(llib-l,libname.ln)                    @@\
  1730.                                     @@\
  1731. Concat(llib-l,libname.ln): srclist                    @@\
  1732.     RemoveFile($@)                            @@\
  1733.     $(LINT) Concat($(LINTLIBFLAG),libname) $(LINTFLAGS) srclist
  1734. #endif /* LintLibraryTarget */
  1735.  
  1736.  
  1737. /*
  1738.  * NormalLintTarget - generate rules to lint a set of sources.
  1739.  */
  1740. #ifndef NormalLintTarget
  1741. #define NormalLintTarget(srclist)                    @@\
  1742. lint:                                    @@\
  1743.     $(LINT) $(LINTFLAGS) srclist $(LINTLIBS)            @@\
  1744. lint1:                                    @@\
  1745.     $(LINT) $(LINTFLAGS) $(FILE) $(LINTLIBS)
  1746. #endif /* NormalLintTarget */
  1747.  
  1748.  
  1749. /*
  1750.  * LintTarget - generate rules to lint $(SRCS)
  1751.  */
  1752. #ifndef LintTarget
  1753. #define LintTarget()                            @@\
  1754. NormalLintTarget($(SRCS))
  1755. #endif
  1756.  
  1757.  
  1758. /*
  1759.  * LinkSourceFile - snag source file from some other directory
  1760.  */
  1761. #ifndef LinkSourceFile
  1762. #define LinkSourceFile(src,dir)                        @@\
  1763. src:  dir/src                                @@\
  1764.     RemoveFile($@)                            @@\
  1765.     $(LN) $? $@                            @@\
  1766.                                     @@\
  1767. includes:: src                                @@\
  1768.                                     @@\
  1769. depend:: src                                @@\
  1770.                                     @@\
  1771. clean::                                    @@\
  1772.     RemoveFile(src)
  1773. #endif
  1774.  
  1775.  
  1776. /*
  1777.  * LinkFile - link a file
  1778.  */
  1779. #ifndef LinkFile
  1780. #define LinkFile(tofile,fromfile)                    @@\
  1781. tofile:: fromfile                            @@\
  1782.     RemoveFile($@)                            @@\
  1783.     $(LN) $? $@                            @@\
  1784.                                     @@\
  1785. includes:: tofile                            @@\
  1786.                                     @@\
  1787. depend:: tofile                                @@\
  1788.                                     @@\
  1789. clean::                                    @@\
  1790.     RemoveFile(tofile)
  1791. #endif
  1792.  
  1793.  
  1794. #ifndef MakeSubincludesForBuild
  1795. #define MakeSubincludesForBuild(step,dir,srclist)            @@\
  1796. step::  dir srclist                            @@\
  1797.     @-(list=`echo srclist | sed -e 's/[^ ]*\///g'`; \        @@\
  1798.         set -x; cd dir; RemoveFiles($$list))            @@\
  1799.     @for i in srclist; do \                        @@\
  1800.         (set -x; cd dir; $(LN) ../$$i .); \            @@\
  1801.     done                                @@\
  1802.                                     @@\
  1803. dir::                                    @@\
  1804.     $(MKDIRHIER) dir                        @@\
  1805.                                     @@\
  1806. clean::                                    @@\
  1807.     @-(if [ -d dir ]; then \                    @@\
  1808.         list=`echo srclist | sed -e 's/[^ ]*\///g'`; \        @@\
  1809.         set -x; cd dir; RemoveFile($$list); else exit 0; fi)
  1810. #endif
  1811.  
  1812.  
  1813. /*
  1814.  * NamedTargetSubdirs - recursively make a series of steps
  1815.  */
  1816. #ifndef NamedTargetSubdirs
  1817. #define NamedTargetSubdirs(name,dirs,verb,flags,subname)        @@\
  1818. name::                                    @@\
  1819.     @case '${MFLAGS}' in *[ik]*) set +e;; esac; \            @@\
  1820.     for i in dirs ;\                        @@\
  1821.     do \                                @@\
  1822.         (cd $$i ; echo verb "in $(CURRENT_DIR)/$$i..."; \    @@\
  1823.             $(MAKE) $(MFLAGS) flags subname); \        @@\
  1824.     done
  1825. #endif
  1826.  
  1827.  
  1828. /*
  1829.  * NamedMakeSubdirs - generate rules to do makes in the given subdirectories.
  1830.  * If you want CDEBUGFLAGS passed along to subdirectories, provide a line like
  1831.  * the following in the appropriate Imakefile
  1832.  * 
  1833.  *         #define PassCDebugFlags 'CDEBUGFLAGS=$(CDEBUGFLAGS)'
  1834.  */
  1835. #ifndef NamedMakeSubdirs
  1836. #define NamedMakeSubdirs(name,dirs) \
  1837. NamedTargetSubdirs(name,dirs,"making" name,PassCDebugFlags,all)
  1838. #endif /* NamedMakeSubdirs */
  1839.  
  1840. #ifndef MakeSubdirs
  1841. #define MakeSubdirs(dirs)                        @@\
  1842. NamedMakeSubdirs(all,dirs)
  1843. #endif /* MakeSubdirs */
  1844.  
  1845.  
  1846. /*
  1847.  * DependSubdirs - generate rules to recursively compute dependencies as
  1848.  * part of the make depend step.
  1849.  */
  1850. #ifndef DependSubdirs
  1851. #define DependSubdirs(dirs) \
  1852. NamedTargetSubdirs(depend,dirs,"depending",NullParameter,depend)
  1853. #endif /* DependSubdirs */
  1854.  
  1855.  
  1856. /*
  1857.  * ForceSubdirs - force make to build subdirectories
  1858.  */
  1859. #ifndef ForceSubdirs
  1860. #define ForceSubdirs(dirs)                        @@\
  1861. dirs: FRC                                @@\
  1862.     @cd $@ ; echo "making all in $(CURRENT_DIR)/$@..."; \        @@\
  1863.     $(MAKE) $(MFLAGS) PassCDebugFlags all                @@\
  1864.                                     @@\
  1865. FRC:
  1866. #endif /* ForceSubdirs */
  1867.  
  1868. /*
  1869.  * InstallSubdirs - generate rules to recursively install programs and files.
  1870.  */
  1871. #ifndef InstallSubdirs
  1872. #define InstallSubdirs(dirs) \
  1873. NamedTargetSubdirs(install,dirs,"installing",DESTDIR=$(DESTDIR),install)
  1874. #endif /* InstallSubdirs */
  1875.  
  1876.  
  1877. /*
  1878.  * InstallManSubdirs - generate rules to recursively install manual pages.
  1879.  */
  1880. #ifndef InstallManSubdirs
  1881. #define InstallManSubdirs(dirs) \
  1882. NamedTargetSubdirs(install.man,dirs,"installing man pages",DESTDIR=$(DESTDIR),install.man)
  1883. #endif /* InstallManSubdirs */
  1884.  
  1885.  
  1886. /*
  1887.  * IncludesSubdirs - generate rules to recursively put include files in build
  1888.  */
  1889. #ifndef IncludesSubdirs
  1890. #define IncludesSubdirs(dirs) \
  1891. NamedTargetSubdirs(includes,dirs,including,NullParameter,includes)
  1892. #endif
  1893.  
  1894.  
  1895. /*
  1896.  * FilterSubdirs - generate rules to recursively filter source files
  1897.  */
  1898. #ifndef FilterSubdirs
  1899. #define FilterSubdirs(dirs) \
  1900. NamedTargetSubdirs(filter,dirs,filtering,NullParameter,filter)
  1901. #endif
  1902.  
  1903.  
  1904. /*
  1905.  * HeadersSubdirs - generate rules to recursively generate header files
  1906.  */
  1907. #ifndef HeadersSubdirs
  1908. #define HeadersSubdirs(dirs) \
  1909. NamedTargetSubdirs(headers,dirs,"generating headers",NullParameter,headers)
  1910. #endif
  1911.  
  1912.  
  1913. /*
  1914.  * CleanHeadersSubdirs - generate rules to recursively clean generated headers
  1915.  */
  1916. #ifndef CleanHeadersSubdirs
  1917. #define CleanHeadersSubdirs(dirs) \
  1918. NamedTargetSubdirs(clean_headers,dirs,"cleaning headers",NullParameter,clean_headers)
  1919. #endif
  1920.  
  1921.  
  1922. /*
  1923.  * InstallLinkKitSubdirs - generate rules to recursively install server Link
  1924.  *                         Kit (only used for XFree86). This is a no-op
  1925.  *                         rule so that Imakefiles on non-XFree86 systems
  1926.  *                         continue to build Makefiles correctly.
  1927.  */
  1928. #ifndef InstallLinkKitSubdirs
  1929. #define InstallLinkKitSubdirs(dirs)
  1930. #endif
  1931.  
  1932.  
  1933. /*
  1934.  * CleanSubdirs - generate rules to recursively clean out garbage files.
  1935.  */
  1936. #ifndef NamedCleanSubdirs
  1937. #define NamedCleanSubdirs(name,dirs) \
  1938. NamedTargetSubdirs(name,dirs,"cleaning",RM_CMD='$(RM_CMD)',clean)
  1939. #endif /* NamedCleanSubdirs */
  1940.  
  1941. #ifndef CleanSubdirs
  1942. #define CleanSubdirs(dirs) \
  1943. NamedCleanSubdirs(clean,dirs)
  1944. #endif
  1945.  
  1946.  
  1947. /*
  1948.  * TagSubdirs - generate rules to recursively create tags files.
  1949.  */
  1950. #ifndef NamedTagSubdirs
  1951. #define NamedTagSubdirs(name,dirs) \
  1952. NamedTargetSubdirs(name,dirs,"tagging",TAGS='$(TAGS)',tags)
  1953. #endif /* TagSubdirs */
  1954.  
  1955. #ifndef TagSubdirs
  1956. #define TagSubdirs(dirs) \
  1957. NamedTagSubdirs(tags,dirs)
  1958. #endif
  1959.  
  1960. /*
  1961.  * MakeLintSubdirs - generate rules to recursively lint directories as part 
  1962.  * of the named step.
  1963.  */
  1964. #ifndef MakeLintSubdirs
  1965. #define MakeLintSubdirs(dirs,target,subtarget) \
  1966. NamedTargetSubdirs(target,dirs,"linting" for target and subtarget,DESTDIR=$(DESTDIR) LINTOPTS='$(LINTOPTS)',subtarget)
  1967. #endif /* MakeLintSubdirs */
  1968.  
  1969.  
  1970. /*
  1971.  * LintSubdirs - generate rules to recursively lint directories as part of 
  1972.  * the make lint step.
  1973.  */
  1974. #ifndef LintSubdirs
  1975. #define LintSubdirs(dirs)                        @@\
  1976. MakeLintSubdirs(dirs,lint,lint)
  1977. #endif /* LintSubdirs */
  1978.  
  1979.  
  1980. /*
  1981.  * MakeLintLibSubdirs - generate rules to recursively create lint libraries.
  1982.  */
  1983. #ifndef MakeLintLibSubdirs
  1984. #define MakeLintLibSubdirs(dirs)                    @@\
  1985. MakeLintSubdirs(dirs,lintlib,lintlib)
  1986. #endif /* MakeLintLibSubdirs */
  1987.  
  1988.  
  1989. /*
  1990.  * MakeMakeSubdirs - generate rules to recursively recreate Makefiles as part
  1991.  * of the specified step in the build.  If $(TOP) is set to an absolute path, 
  1992.  * do not prepend the ../ prefix.  This makes running things outside of the 
  1993.  * source tree to be much easier.
  1994.  */
  1995. #ifndef MakeMakeSubdirs
  1996. #define MakeMakeSubdirs(dirs,target)                    @@\
  1997. target::                                @@\
  1998.     -@case '${MFLAGS}' in *[ik]*) set +e;; esac; \            @@\
  1999.     case '${MFLAGS}' in *n*) executeit="no";; esac; \        @@\
  2000.     for i in dirs ;\                        @@\
  2001.     do \                                @@\
  2002.         case "$(CURRENT_DIR)" in \                @@\
  2003.         .) curdir= ;; \                        @@\
  2004.         *) curdir=$(CURRENT_DIR)/ ;; \                @@\
  2005.         esac; \                            @@\
  2006.         echo "making Makefiles in $$curdir$$i..."; \        @@\
  2007.         itmp="$$i" \                        @@\
  2008.         curtmp="$(CURRENT_DIR)" \                @@\
  2009.         toptmp=""; \                        @@\
  2010.         case "$$itmp" in \                    @@\
  2011.             ../?*) \                         @@\
  2012.             while echo "$$itmp" | grep '^../' > /dev/null;\    @@\
  2013.               do \                        @@\
  2014.                  toptmp="/`basename $$curtmp`$$toptmp"; \    @@\
  2015.                  curtmp="`dirname $$curtmp`"; \        @@\
  2016.                  itmp="`echo $$itmp | sed 's;../;;'`"; \    @@\
  2017.               done \                    @@\
  2018.             ;; \                        @@\
  2019.         esac; \                            @@\
  2020.         case "$$itmp" in \                    @@\
  2021.         */?*/?*/?*/?*)    newtop=../../../../..;; \        @@\
  2022.         */?*/?*/?*)    newtop=../../../..;; \            @@\
  2023.         */?*/?*)    newtop=../../..;; \            @@\
  2024.         */?*)        newtop=../..;; \            @@\
  2025.         *)        newtop=..;; \                @@\
  2026.         esac; \                            @@\
  2027.         newtop="$$newtop$$toptmp"; \                @@\
  2028.         case "$(TOP)" in \                    @@\
  2029.         /?*) imaketop=$(TOP) \                    @@\
  2030.              imakeprefix= ;; \                    @@\
  2031.         .) imaketop=$$newtop \                    @@\
  2032.            imakeprefix=$$newtop/ ;; \                @@\
  2033.         *) imaketop=$$newtop/$(TOP) \                @@\
  2034.            imakeprefix=$$newtop/ ;; \                @@\
  2035.         esac; \                            @@\
  2036.         cd $$i; \                        @@\
  2037.         RemoveFile(Makefile.bak); \                @@\
  2038.         if [ -f Makefile ]; then \                @@\
  2039.             echo "    $(MV) Makefile Makefile.bak"; \        @@\
  2040.             if [ "$$executeit" != "no" ]; then \        @@\
  2041.                 $(MV) Makefile Makefile.bak; \        @@\
  2042.             fi; \                        @@\
  2043.         fi; \                            @@\
  2044.         if [ "$$executeit" != "no" ]; then \            @@\
  2045.             ImakeSubCmdHelper -DTOPDIR=$$imaketop -DCURDIR=$$curdir$$i; \ @@\
  2046.         fi; \                            @@\
  2047.         $(MAKE) $(MFLAGS) Makefiles; \                @@\
  2048.         cd $$newtop; \                        @@\
  2049.     done
  2050.  
  2051. #ifdef UseInstalled
  2052. #define ImakeSubCmdHelper $(IMAKE_CMD)
  2053. #else
  2054. #define ImakeSubCmdHelper $$imakeprefix$(IMAKE) -I$$imakeprefix$(IRULESRC) $(IMAKE_DEFINES)
  2055. #endif
  2056.  
  2057. #endif /* MakeMakeSubdirs */
  2058.  
  2059.  
  2060. /*
  2061.  * MakefileSubdirs - generate rules to create Makefiles.
  2062.  */
  2063. #ifndef MakefileSubdirs
  2064. #define MakefileSubdirs(dirs)                        @@\
  2065. MakeMakeSubdirs(dirs,Makefiles)
  2066. #endif /* MakefileSubdirs */
  2067.  
  2068. /*
  2069.  * Translate XCOMM into pound sign with sed, rather than passing -DXCOMM=XCOMM
  2070.  * to cpp, because that trick does not work on all ANSI C preprocessors.
  2071.  * Also delete line numbers from the cpp output (-P is not portable, I guess).
  2072.  */
  2073. #ifndef CppSedMagic
  2074. #define CppSedMagic sed -e '/^#  *[0-9][0-9]*  *.*$$/d' -e '/^XCOMM$$/s//#/' -e '/^XCOMM[^a-zA-Z0-9_]/s/^XCOMM/#/'
  2075. #endif /* CppSedMagic */
  2076.  
  2077. /*
  2078.  * CppScriptTarget - generate rules to create a shell script by running the
  2079.  * input through cpp.  If the ExecableScripts configuration parameter is not
  2080.  * set, then make sure that the first line begins with a colon.
  2081.  */
  2082. #ifndef CppScriptTarget
  2083. #if ExecableScripts        /* can use #! instead of colon */
  2084. #define CppScriptTarget(dst,src,defs,deplist)                @@\
  2085. dst::  src deplist                            @@\
  2086.     RemoveFile($@)                            @@\
  2087.     $(CPP) defs <src | CppSedMagic >$@                @@\
  2088.     chmod a+x $@                            @@\
  2089.                                     @@\
  2090. clean::                                    @@\
  2091.     RemoveFile(dst)
  2092. #else
  2093. #define CppScriptTarget(dst,src,defs,deplist)                @@\
  2094. dst::  src deplist                            @@\
  2095.     RemoveFile($@)                            @@\
  2096.     echo \: >$@                            @@\
  2097.     sed '1d' src | $(CPP) defs | CppSedMagic >>$@            @@\
  2098.     chmod a+x $@                            @@\
  2099.                                     @@\
  2100. clean::                                    @@\
  2101.     RemoveFile(dst)
  2102. #endif /* ExecableScripts */
  2103. #endif /* CppScriptTarget */
  2104.  
  2105.  
  2106. /*
  2107.  * MakeScriptFromCpp - generate rules to create a script from a file with a
  2108.  * .cpp suffix.
  2109.  */
  2110. #ifndef MakeScriptFromCpp
  2111. #define MakeScriptFromCpp(name,defs)                    @@\
  2112. CppScriptTarget(name,name.cpp,defs,NullParameter)
  2113. #endif /* MakeScriptFromCpp */
  2114.  
  2115. #ifndef CppFileTarget
  2116. #define CppFileTarget(dst,src,defs,deplist)                @@\
  2117. dst::  src deplist                            @@\
  2118.     RemoveFile($@)                            @@\
  2119.     $(CPP) defs <src | CppSedMagic >$@                @@\
  2120.                                     @@\
  2121. clean::                                    @@\
  2122.     RemoveFiles(dst)
  2123. #endif /* CppFileTarget */
  2124.  
  2125. /*
  2126.  * MakeDirectories - generate rules to create a hierarchy of directories.
  2127.  */
  2128. #ifndef MakeDirectories
  2129. #define MakeDirectories(step,dirs)                    @@\
  2130. step::                                    @@\
  2131.     @case '${MFLAGS}' in *[i]*) set +e;; esac;            @@\
  2132.     DirFailPrefix@for i in dirs; do if [ -d $(DESTDIR)$$i ]; then \    @@\
  2133.         set +x; else (set -x; $(MKDIRHIER) $(DESTDIR)$$i); fi \    @@\
  2134.     done
  2135. #endif /* MakeDirectories */
  2136.  
  2137.  
  2138. /*
  2139.  * AllTarget - generate rules to build necessary things during make all.
  2140.  */
  2141. #ifndef AllTarget
  2142. #define AllTarget(depends)                        @@\
  2143. all:: depends
  2144. #endif /* AllTarget */
  2145.  
  2146. #ifdef DefineOldLibraryRules
  2147. #include <oldlib.rules>
  2148. #endif
  2149.